2016-11-23 128 views
1

我已經在這些表中一個Django應用程序:Django的過濾器外鍵逆轉

class Order(models.Model): 
    ... 

class SubOrder1(models.Model): 
    order = models.ForeignKey(Order, blank=True, null=True) 

class SubOrder2(models.Model): 
    order = models.ForeignKey(Order, blank=True, null=True) 

... 

我怎麼能寫上訂單查詢導致僅具有至少一個相關SubOrder1或SubOrder2的命令?我需要這樣的東西

Order.objects.filter(suborder__count__ge = 1, ...) 

我使用Django = 1.9.2和Python 3.4.1 =

回答

2

使用isnull現場查詢:

orders_with_suborders = Order.objects.filter(
    Q(suborder1__isnull=False) | Q(suborder2__isnull=False) 
) 
+0

謝謝,那就是我一直在尋找的。 – user2194805

+0

除非使用'distinct()',否則這可能會導致重複。 – Alasdair

1

Annotate your queryset與相關模型的罪狀:

from django.db.models import Count 

queryset = Order.objects.annotate(
    num_suborder1=Count('suborder1', distinct=True), 
    num_suborder2=Count('suborder2', distinct=True), 
) 

查看關於combining multiple aggregations的文檔以解釋我們爲什麼需要distinct=True

然後,您可以使用Q過濾其中任一計數位於leas t 1.

orders_with_suborders = queryset.filter(
    Q(num_suborder1__gte=1) | Q(num_suborder1=1__gte=1), 
) 
-1

你可以從Order得到SubOrder1

order = Order.objects.get(pk=pk) 
suborders1 = order.suborder1_set.all() 

然後你就可以通過亞目迭代:

for suborder in suborders1: 
    print (suborder) 

希望它可以幫助你

0

一個解決方案,我只是發現會是這樣的:

Order.objects.filter(suborder1__id__gt = -1) 

,我可以SubOrder2使用相同。這是一個解決方案,但不是真正的djangonic。有沒有更好的解決方案?

+0

注意,你可能會得到每個亞目重複的結果。你可以使用'distinct()'來避免這種情況。 – Alasdair

+0

是的。謝謝! 。 – user2194805