Mam 2 stoły. Jeden właściciel może mieć żaden ani wiele przedmiotów.

Item

id  name    owner_id (fk) 
1   alpha   1
2   beta    1


Owner

id   name     attrc 
1   owner1    complex_attr1
2   owner2    complex_attr2 

Rezerwuję je oddzielnie z bazy danych jako list:

    for item in item_list:
        for owner in owner_list:
            if item.owner_id == owner.id:
              # I modify owner attributes    
              owner.attrc = modify_funct(attrc)
              item.owner = owner 

Wymień Items w HTML i dla każdego Item pokazuję niektóre właściwości Owner Item. W pętli robię Owner właściwość obiektu Item; Rzecz ma pokazać w HTML, muszę zmodyfikować niektóre z właściwości Owner RAW DB

Więc w tworzeniu szablonu HTML będę miał coś w rodzaju:

for item in item_list:
 <div>
   item.name
   <span> item.owner.name<span>
   <span> item.owner.attrc<span>
</div>

Ponieważ Owner with id 1 jest właścicielem zarówno Item with id 1 and 2, w pierwszym iteracji w pętli, modyfikowany jest druga iteracja w pętli "attrc" jest już modyfikowana, a funkcja nie znaleziono to, czego oczekuje się.

Rozwiązaniem jest pętla / zmienić "Attrc" na zewnątrz z inną pętlę, a następnie pętla pętla_list i właściciela_list, aby zrobić mniej pętli?

0
user3541631 22 luty 2019, 13:15

2 odpowiedzi

Najlepsza odpowiedź

To nie jest najbardziej efektywne rozwiązanie, ale jest najbardziej podobny do twojego istniejącego kodu:

for owner in owner_list:
    if any(item.owner_id == owner.id for item in item_list):
        owner.attrc = modify_funct(attrc)
1
Alex Hall 22 luty 2019, 10:27

Bardziej wydajne rozwiązanie przy użyciu zestawu zestawu:

owner_ids = {item.owner_id for item in item_list}
for owner in owner_list:
    if owner.id in owner_ids:
        owner.attrc = modify_funct(attrc)
0
Alex Hall 22 luty 2019, 10:29