Django过滤器集和(?)条件

2024-04-25 22:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个应用程序,其中食物有几个组成部分,每个组成部分都有特定的价值。我希望能够过滤食物中特定成分的价值。在

以下是我的模型:

class Food(models.Model):
    id = models.AutoField(primary_key=True, db_column="id")
    name = models.CharField(max_length=150)
    product_type = models.CharField(max_length=150)

class Component(models.Model):

    id = models.AutoField(primary_key=True, db_column="id")
    name = models.CharField(max_length=150)
    value = models.FloatField()
    food = models.ForeignKey(Food, related_name='food_components', related_query_name='food_components')

然后定义过滤器集和视图

^{pr2}$

我希望能够使用相关模型中的多个字段(结合两个参数)过滤视图集。像http://whatever/foods/components__name=X&components__value=1这样的东西可以得到所有元素X值为1的食物。我正在使用django rest框架过滤器(https://github.com/philipn/django-rest-framework-filters

从我看来,因为所有的食物都有所有的元素,所以组分的名字是不相关的,我会得到所有含有值为1的成分的食物。如何将两者结合起来?在

提前谢谢!在


Tags: name模型idmodelfoodmodelscomponentslength
1条回答
网友
1楼 · 发布于 2024-04-25 22:41:35

您需要创建一个新的过滤器来处理与给定的Component相关的单个Food对象上的nameval对:

class FoodComponentFilter(django_filters.Filter):
    def filter(self, qs, value):
        strs = value.split(',')
        if len(strs) != 2:
            raise Exception
        return qs.filter(
            food_components__in = Component.objects.filter(
                name=strs[0],
                value=float(strs[1])
            )
        )

FoodFilter中实例化此项:

^{pr2}$

然后,像这样使用它:

?component_food_pair=Foo,42.0

相关问题 更多 >