2016-03-21 16 views
7

Aşağıdaki modelleri var:Django: koşullu ifade

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

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

Ne yapmaya çalışıyorum belirli bir kuruluş (self.organization) için tüm anlaşmaların bir listesini almak ve bilgilerle her anlaşmayı açıklama Belirli bir üye tarafından imzalanıp imzalanmadığı (self.member).

Sözleşme imzalandıysa, belirli bir sözleşme ve üye için bir İmzalı Sözleşme örneği bulunmaktadır.

Bunun için bir sorgu nasıl yazarım?

İşte benim çaba şimdiye kadar var:

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 

Bu, doğru sonuçlar elde edilmez.

Herhangi bir yardım için teşekkür ederiz. Şimdiden teşekkürler.

cevap

8

Burada bir Case kullanmak istediğinizi düşünüyorum.

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

Cevabınız için teşekkürler, bu bana istediğim şeye çok yaklaşıyor. Bu hatayı alıyorum: django.core.exceptions.FieldError: İfade türü çözülemiyor, bilinmeyen output_field Bunun ne anlama geldiğini biliyor musunuz? –

+1

'Case' ne tür bir alan olduğunu söylemelisiniz, cevabın düzenlendiğini görüyorum, – sedavidw

+0

ah, gördüğünüze çok teşekkür ederim. –

0

Kabul cevap Django 1.11.6 benim için işe yaramadı. Çalışması için then inside When'u koymam gerekiyordu.

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' 
    )