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