我有一个型号ModelA。
class ModelA:
m2m_1_field = models.BooleanField()
#lots of other fields
它有2平方米的关系m2m_1和m2m_2都返回相同的类型
如果ModelA的字段m2m_1_field为True,那么我们需要从m2m_1获取m2m结果(如instance.m2m_1.all())。
如果ModelA的字段m2m_1_field为False,那么我们需要从m2m_2获取m2m结果(如instance.m2m_2.all())。
因此,在搜索此模型时,我还必须搜索这些m2m关系。
让我们说,我们需要搜索带有ID 1和2的m2m对象。然后,我们应该这样做:
if m2m_1_field is True:
for id in [1,2]:
queryset = queryset.filter(m2m_1__id=id)
if m2m_1_field is False:
for id in [1,2]:
queryset = queryset.filter(m2m_2__id=id)
以上只是理论上的解释,我们怎样才能实际做到这一点?
或者简单地忘记m2m,假设还有2个字段f1,f2(两个char字段)。如果m2m_1_field为True,我们需要搜索f1字段,如果m2m_1_field为False,我们需要搜索f2字段。怎么样?
只是一个猜测:
filter(Q(m2m_1_field=True, f1=val) | Q(m2m_1_field=False, f2=val))) Is this right?
请告知我们进一步说明。
答案 0 :(得分:0)
你与上一个例子非常接近。我想你想要的是以下内容:
我将定义我认为你的模型是什么。
class M2MModel:
pass
class ModelA:
m2m_1_field = models.BooleanField()
m2m_1 = models.ManyToManyField(M2MModel, related_name="m2m_1_set", null=True, blank=True)
m2m_2 = models.ManyToManyField(M2MModel, related_name="m2m_2_set", null=True, blank=True)
为了返回正确的M2MModel集合,您希望在M2MModel
而不是ModelA
上执行查询。
model_a_id = SOME_ID_VALUE
results = M2MModel.objects.filter(
Q(m2m_1_set__id=model_a_id, m2m_1_set__m2m_1_field=True)
| Q(m2m_2_set__id=model_a_id, m2m_2_set__m2m_1_field=False)
).distinct()