2016-03-21 28 views
7

mam następujące modele:Django: Wyrażenie warunkowe

class Agreement(models.Model): 
    ... 
    organization = models.ForeignKey("Organization") 

class Signed_Agreement(models.Model): 
    agreement = models.ForeignKey("Agreement") 
    member = models.ForeignKey("Member") 

Co staram się zrobić to uzyskać listę wszystkich umów dotyczących danej organizacji (self.organization) i opisywanie każdego umowę z informacji o tym, czy został podpisany przez konkretnego członka (self.member).

Jeśli Umowa została podpisana, istnieje instancja umowy Signed_Agent dotycząca konkretnej umowy i członka.

Jak napisać zapytanie dotyczące tego?

Oto mój wysiłek tej pory:

from django.db.models import When, F, Q, Value 

def get_queryset(self): 

    agreements = _agreement_model.Agreement.objects.filter(
     organization=self.organization 
    ).annotate(
     signed=When(Q(signed_agreement__member=self.member), then=Value(True)) 
    ).order_by(
     'name' 
    ) 

    return agreements 

To nie jest produkujących poprawnych wyników.

Każda pomoc zostanie doceniona. Z góry dziękuję.

Odpowiedz

8

Myślę, że chcesz używać tutaj Case.

def get_queryset(self): 

    agreements = _agreement_model.Agreement.objects.filter(
     organization=self.organization 
    ).annotate(
     signed=Case(When(signed_agreement__member=F('member')), 
        then=Value(True), 
        default=Value(False), 
        output_field=BooleanField() 
    ).order_by(
     'name' 
    ) 

    return agreements 
+0

Dziękuję za odpowiedź, dzięki czemu jestem bardzo blisko tego, co chcę. Otrzymuję ten błąd: django.core.exceptions.FieldError: Nie można rozwiązać typu wyrażenia, nieznany pole_wyjściowe Czy wiesz, co to oznacza? –

+1

Wygląda na to, że musisz powiedzieć "Sprawie", jaki to rodzaj pola, zredagowałem odpowiedź, aby to zrobić – sedavidw

+0

ah widzę, dziękuję bardzo. –

0

Przyjęta odpowiedź nie zadziałała dla mnie z Django 1.11.6. Musiałem umieścić then inside When, aby działało.

from django.db.models import Case, When, F, BooleanField 


def get_queryset(self): 
    agreements = _agreement_model.Agreement.objects.filter(
     organization=self.organization 
    ).annotate(
     signed=Case(
      When(
       signed_agreement__member=F('member'), 
       then=True 
      ), 
      default=False, 
      output_field=BooleanField() 
     ) 
    ).order_by(
     'name' 
    )