2016-03-21 74 views
7

我有以下型號:Django的:條件表達式

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

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

我想要做的就是針對特定組織(self.organization)的所有協議的清單和註釋與信息的每個協議關於它是否由特定成員(self.member)簽署。

如果協議已經簽署,則存在對特定協議和成員Signed_Agreement的一個實例。

如何爲此編寫查詢?

這裏是我的努力迄今:

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 

這不產生正確的結果。

任何幫助,將不勝感激。提前致謝。

回答

8

我想你想被使用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

感謝您的回答,這讓我非常接近我想要的東西。我收到此錯誤: django.core.exceptions.FieldError:無法解析表達式類型,未知output_field 你知道這是什麼意思? –

+1

看起來你必須告訴'Case'它是什麼類型的字段,我已經編輯了這樣的答案 – sedavidw

+0

啊我看到了,非常感謝。 –

0

接受的答案對我來說不起作用Django 1.11.6。我不得不讓then inside When使它工作。

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