Django FilterSet和(?)条件(Django FilterSet AND(?) condition)

编程入门 行业动态 更新时间:2024-10-24 12:27:06
Django FilterSet和(?)条件(Django FilterSet AND(?) condition)

我正在创建一个应用程序,其中食物具有多个组件,并且每个组件都具有特定值。 我希望能够过滤食物以获得特定成分的价值。

这是我的模特:

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')

然后我定义过滤器集和视图

import rest_framework_filters as filters class ComponentFilter(filters.FilterSet): name = filters.CharFilter(name="name") val = filters.NumberFilter(name="value", distinct=True) minval = filters.NumberFilter(name="value", lookup_type="gte", distinct=True) maxval = filters.NumberFilter(name="value", lookup_type="lte", distinct=True) class Meta: model = Component class FoodFilter(filters.FilterSet): name = filters.CharFilter(name='name') product_type = filters.CharFilter(name='product_type') components = filters.RelatedFilter(ComponentFilter, name='food_components') class Meta: model = Food class FoodViewSet(viewsets.ModelViewSet): queryset = Food.objects.all() serializer_class = FoodSerializer filter_class = FoodFilter

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

从我看到的,因为所有食物都含有所有元素,所以组件_name是无关紧要的,我会得到所有含有任何成分值的食物1.如何将两者结合起来?

提前致谢!

I am creating an application where food has several components, and each component has a specific value. I want to be able to filter food for the value of a specific component.

Here are my models:

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')

Then I define filter sets and the view

import rest_framework_filters as filters class ComponentFilter(filters.FilterSet): name = filters.CharFilter(name="name") val = filters.NumberFilter(name="value", distinct=True) minval = filters.NumberFilter(name="value", lookup_type="gte", distinct=True) maxval = filters.NumberFilter(name="value", lookup_type="lte", distinct=True) class Meta: model = Component class FoodFilter(filters.FilterSet): name = filters.CharFilter(name='name') product_type = filters.CharFilter(name='product_type') components = filters.RelatedFilter(ComponentFilter, name='food_components') class Meta: model = Food class FoodViewSet(viewsets.ModelViewSet): queryset = Food.objects.all() serializer_class = FoodSerializer filter_class = FoodFilter

I want to be able to filter a viewset using more than one field in a related model (combining both parameters). Something like http://whatever/foods/components__name=X&components__value=1 would get me all foods with the element X of value 1. I am using django-rest-framework-filters (https://github.com/philipn/django-rest-framework-filters)

From what I see, since all foods have all the elements, the components__name is irrelevant, and I will get all the foods that have any component with the value 1. How can I combine both?

Thanks in advance!

最满意答案

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

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实例化:

class FoodFilter(filters.FilterSet): component_food_pair = FoodComponentFilter(name='dummy_field') [...] class Meta: model = Food fields = ('component_food_pair',[...])

然后,使用它像:

?component_food_pair=Foo,42.0

You'll need to create a new filter that handles the name, val pair on a single Food object that is related to a given Component:

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]) ) )

Instantiate this in the FoodFilter:

class FoodFilter(filters.FilterSet): component_food_pair = FoodComponentFilter(name='dummy_field') [...] class Meta: model = Food fields = ('component_food_pair',[...])

Then, use it like:

?component_food_pair=Foo,42.0

更多推荐

value,class,食物,filters,电脑培训,计算机培训,IT培训"/> <meta name="descri

本文发布于:2023-07-28 01:16:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1298293.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:条件   Django   FilterSet   condition

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!