gpt4 book ai didi

python - Django FilterSet AND(?)条件

转载 作者:行者123 更新时间:2023-11-28 16:28:48 24 4
gpt4 key购买 nike

我正在创建一个应用程序,其中食物有多个成分,每个成分都有特定的值。我希望能够根据特定成分的值(value)过滤食物。

这是我的模型:

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

然后我定义过滤器集和 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

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

据我所知,由于所有食物都包含所有元素,因此 components__name 是无关紧要的,我将获得所有具有值为 1 的成分的食物。如何将两者结合起来?

提前致谢!

最佳答案

您需要创建一个新过滤器来处理 namevalsingle Food 与给定的 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])
)
)

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

关于python - Django FilterSet AND(?)条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com