django过滤器基于字段/列值

时间:2014-06-11 21:28:31

标签: django

我有一个型号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?

请告知我们进一步说明。

1 个答案:

答案 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()