[英]Django Many-To-Many filtering
假定以下模型集:
class A(models.Model):
pass
class B(models.Model):
pass
class M2M(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
在朴素的Django ORM中,通過鏈接上的某些條件過濾 (這是大型應用程序鏈的一部分)的一種方法是:
def fun():
as = A.objects.filter("some complex queryset")
m2ms = M2M.objects.filter("some complex B-dependent QS")
return as.filter(id__in=[m.a_id for m in m2ms])
但這顯然會產生一個非常糟糕的查詢“ id__in”,並且顯然會作為兩個查詢執行。
有沒有更好的方法讓Django產生適當的聯接?
您應該通過M2M明確聲明從A到B的多對多字段。
class A(models.Model):
bs = models.ManyToManyField('B', through='M2M')
現在,您可以簡單地執行以下操作:
A.objects.filter(condition_on_A='foo').filter(b__condition_on_b='bar')
您將可以在單個查詢中實現。 例如,假設您只想過濾模型B
字段x
上那些值大於50的記錄,您可以這樣做:
A.objects.filter("some-filter-criteria", m2m__b__x__gt=50)
您可以在此處閱讀有關名稱查找的更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.