【问题标题】:django-filter and DRF: AND clause in a lookupfielddjango-filter 和 DRF:查找字段中的 AND 子句
【发布时间】:2018-04-11 08:13:36
【问题描述】:

这个问题扩展了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

【问题讨论】:

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


【解决方案1】:

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

查询集确实支持|(联合)运算符,因此您可以将默认结果与字段结果为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')

我没有测试过这段代码,所以它可能不能完全按照写的那样工作,但你明白了。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2021-04-15
    • 2011-04-11
    • 1970-01-01
    • 2021-10-28
    • 2020-11-06
    • 2022-01-26
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多