2016-03-21 31 views
7

tôi có các mô hình sau:Django: biểu thức điều kiện

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

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

Những gì tôi đang cố gắng làm là có được một danh sách tất cả các thỏa thuận cho một tổ chức cụ thể (self.organization) và chú thích từng thỏa thuận với thông tin về việc có hay không nó đã được ký bởi một thành viên cụ thể (self.member).

Nếu Thỏa thuận đã được ký, thì tồn tại phiên bản Signed_Agreement cho thỏa thuận và thành viên cụ thể.

Tôi làm cách nào để viết truy vấn cho điều này?

Đây là nỗ lực của tôi cho đến nay:

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 

Đây không phải là sản xuất các kết quả chính xác.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước.

Trả lời

8

Tôi nghĩ bạn muốn sử dụng một số Case tại đây.

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

Cảm ơn câu trả lời của bạn, điều này khiến tôi rất gần với những gì tôi muốn. Tôi nhận được lỗi này: django.core.exceptions.FieldError: Không thể giải quyết loại biểu thức, không rõ output_field Bạn có biết điều này có nghĩa là gì không? –

+1

Có vẻ như bạn phải nói với trường hợp 'Trường hợp 'là loại trường nào, tôi đã chỉnh sửa câu trả lời để làm như vậy – sedavidw

+0

Tôi hiểu rồi, cảm ơn bạn rất nhiều. –

0

Câu trả lời được chấp nhận không hoạt động với tôi với Django 1.11.6. Tôi phải đặt then inside When để làm cho nó hoạt động.

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' 
    ) 
Các vấn đề liên quan