查找字段中的django-filter和DRF:AND子句

时间:2017-10-30 11:06:21

标签: python django django-rest-framework django-filter

此问题扩展为this one

假设我的模型是

class Car(models.Model):
    images = models.ManyToManyField(Image)

class Image(models.Model):
    path = models.CharField()
    type = models.CharField()

我的过滤器类是

class CarFilter(django_filters.FilterSet):
    having_image = django_filters.Filter(name="images", lookup_type='in')

    class Meta:
        model = Car

然后我可以制作像?having_image=5这样的GET查询,并获得所有带有pk=5图像的汽车。没关系。但是,如果我需要将这张图片归还两辆车,并且还有一张列表中没有图像的汽车呢?如何在一个django_filters.Filter中统一两个条件?

1 个答案:

答案 0 :(得分:0)

我不认为django-filter支持开箱即用。您可以尝试创建自己的Filter类并覆盖filter()方法。

Querysets支持|(union)运算符,因此您可以将默认结果与字段结果为None的结果相结合。

class AndNoneFilter(django_filters.Filter):

    def filter(self, qs, value):
        return qs(**{self.field_name: None}) | super().filter(qs, value)

class CarFilter(django_filters.FilterSet):
    having_image = AndNoneFilter(field_name='images', lookup_type='in')

我没有对此代码进行测试,因此它可能无法完全按照书面形式运行,但您明白了。