我有两个模型,它们的 M2M 字段都指向相同的第三个模型:
class Moo(models.Model):
...
class Foo(models.Model):
moos = models.ManyToManyField(Moo, blank=True)
class Bar(models.Model):
moos = models.ManyToManyField(Moo)
我需要找到所有没有选择“manytomany”对象的“Foo”对象,或者至少有一个与单个“Bar”对象匹配的manytomany对象。
所以我的数据可能如下所示:
foo1.moos__all = 'boo', 'yah'
foo2.moos__all = <none>
foo3.moos__all = 'suck'
bar1.moos__all = 'boo'
然后进行此搜索将产生:
bar1.find_matches()
>>> foo1, foo2
过去的数据模型必须包含至少一项匹配项,因此很简单:
Foo.objects.filter(manytomany__in=bar1.moos.all())
现在模型变了,Foo.moos 可以为空。所以简而言之,我需要这样做:
Foo.objects.filter(
Q(moos__in=bar1.moos.all()) | Q(moos__count=0)
)
可悲__count
的是不是一个选择:(
有什么好主意吗?