2010-06-15 11 views
9

mam zestaw modeli Django, jak pokazano na poniższym schemacie (nazwy rewersu związków przedstawiono w żółte pęcherzyki)Jak mogę filtrować te zapisy Django?

Django models http://mipadi.cbstaff.com/images/misc/people_django.jpg

w każdym stosunku, A Person może być 0 lub więcej przedmiotów.

Dodatkowo pole slug jest (niestety) nietypowe; wiele rekordów Person może mieć te same pola karetki. Zasadniczo te rekordy są duplikatami.

Chcę uzyskać listę wszystkich rekordów, które spełniają następujące kryteria: wszystkie zduplikowane rekordy (czyli mające ten sam pocisk) z co najmniej jednym Entry lub co najmniej jeden Audio lub co najmniej jeden Episode lub co najmniej jeden Article.

tej pory mam następujące zapytanie:

Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1) 

tej grupie wszystkie rekordy według slug, następnie dodaje atrybut num_records który mówi, jak wiele rekordów mają ten pocisk, ale dodatkowe filtrowanie nie jest wykonywane (a Nie wiem nawet, czy to i tak by działało, ponieważ, biorąc pod uwagę zestaw duplikatów, można mieć np. I Entry, a drugie może mieć Article).

W skrócie, chcę znaleźć wszystkie zduplikowane rekordy i zwinąć je wraz z powiązanymi modelami w jeden rekord.

Jaki jest najlepszy sposób na zrobienie tego z Django?

+7

+1 dla diagramu klas w kolorach Django! –

Odpowiedz

1

chciałbym to zrobić na kilka pytań. Pierwszym z nich jest lista duplikatów, że masz:

dupes = [p['slug'] for p in Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)] 

bym wtedy pętla przez nich, i dla każdego z nich zdecydować, na których można przechowywać (marka arbitralną decyzję - wybrać pierwszy). Następnie dla wszystkich pozostałych kluczy podstawowych zaktualizuj wszystkie pozostałe obiekty, aby wskazać wybrany klucz podstawowy:

for slug in dupes: 
    pks = [p.id for p in Person.objects.filter(slug=slug)] 
    for pk in pks[1:]: 
     Audio.objects.filter(person=pk).update(person=pks[0]) 
     Author.objects.filter(person=pk).update(person=pks[0]) 
     Episode.objects.filter(person=pk).update(person=pks[0]) 
     Entry.objects.filter(person=pk).update(person=pks[0]) 
+0

Przyjmując to jako odpowiedź. Rozwiązałem problem kilka dni temu, ale skończyło się na tym, że robiłem z grubsza to, co sugerowałeś. – mipadi

0

Nie jestem pewien, czy filtry łańcuchowym będzie Cię tam, gdzie chcesz iść, ponieważ nie będzie wpisów osoby, które mają dwa lub więcej rodzajów artefaktów z ich nazwiskiem. Spojrzeć na poprzednie pytanie StackOverflow i jego odpowiedź, która myślę, że będzie pomóc połączyć cztery zapytania do jednego queryset w żądany sposób:

How to combine 2 or more querysets in a Django view?

Powiązane problemy