2016-06-28 17 views
5

Tôi có một mô hình gọi là 'StoreItem' và một mô hình có tên 'QuoteItem'. Một điểm ItemItem trên một StoreItem.chú thích django - số điều kiện

Tôi đang cố gắng chú thích bộ đếm số lượng mục báo giá trên các mặt hàng trong cửa hàng, nhưng có điều kiện để áp dụng cho các mục báo giá.

tôi đã cố gắng một cái gì đó như thế này:

items = items.annotate(
      quote_count=Count(
       Case(
        When(quoteitem__lookup_date__in=this_week, then=1), 
        output_field=IntegerField() 
       ) 
      ) 
     ) 

'mục' là một queryset của StoreItems. 'this_week' là danh sách các ngày đại diện cho tuần này (đó là bộ lọc mà tôi cố gắng áp dụng). Sau khi tôi thực hiện công việc ngày tháng, tôi muốn thêm nhiều bộ lọc hơn vào số lượng điều kiện này nhưng hãy bắt đầu với điều đó.

Dù sao những gì tôi nhận được là giống như một boolean - nếu Quote Các mặt hàng phù hợp với điều kiện tồn tại, dù có bao nhiêu tôi có, bộ đếm sẽ được 1. khác, sẽ là 0.

Có vẻ giống như Count(Case()) chỉ kiểm tra xem có bất kỳ mục nào tồn tại không và nếu trả về 1, trong khi tôi muốn nó lặp lại trên tất cả các mục báo giá trên mục lưu trữ và đếm chúng, nếu chúng khớp với điều kiện (riêng).

Làm cách nào để điều đó xảy ra?

Trả lời

7

Bạn cần phải bọc tất cả mọi thứ trong một tuyên bố Sum thay vì Count (Tôi tìm thấy nó một chút lẻ rằng Count công trình tại tất cả):

from django.db.models import Case, IntegerField, Sum, When 

items = items.annotate(
     quote_count=Sum(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=1), 
       output_field=IntegerField() 
      ) 
     ) 
    ) 

này về cơ bản thêm lên tất cả các 0 s và 1 s cho tuyên bố bên trong Case, dẫn đến số lượng đối sánh.

0

Tôi đã thực hiện một tác vụ tương tự. Đối với tôi, Sum qua số Case/When không hoạt động do có bao nhiêu bảng tôi đã tham gia (đó là cách tính). Đã kết thúc như thế này:

from django.db.models import Case, IntegerField, Count, When, F 

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) 

Trong trường hợp của tôi, tôi thực sự đã có thêm hai Count s cùng thích:

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) + Count (
      Case(
       When(itemgroup__lookup_date__in=this_week, then=F('itemgroup__quoteitem__id'), 
      ), 
      distinct=True, 
     ) 

Giả sử rằng items thể liên quan đến quoteitems hoặc thông qua một itemgroup hoặc trực tiếp.

Các vấn đề liên quan