簡體   English   中英

Django多對多過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM