DjangoFilters:重写方法以允许属性的模型筛选

2024-05-16 07:44:41 发布

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

这是一个包含一些字段和属性carbs_g_secured的模型:

型号.py

class Food(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)
    ingredients_label = models.TextField()
    moisture_g = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True)

    def __str__(self):
        return self.name

    def carbs_g_secured(self):
        # If moisture is missing
        if self.carbs_g :
            return self.carbs_g,'Carbs provided'
        else :
            return None, 'Moisture is missing'

我想在carbs_g_secured属性上使用django-rest-framework进行一些最小/最大过滤。我知道我不能直接用Django-filters来做这件事,但我试图覆盖整个事情

我有以下方法:

序列化程序.py

class FoodSerializer(serializers.ModelSerializer):
    carbs_g_secured = serializers.ReadOnlyField()
    class Meta:
        model = Food
        fields = '__all__'

视图.py

class FoodFilter(filters.FilterSet):
    carbs_g_secured_max = django_filters.NumberFilter(method='MyPropertyFilter')
    class Meta:
        model = Food
        fields = {'name': ['exact', 'in', 'startswith'],
                  'species':['exact'],
                  'protein_g':['exact','lte','gte'],
                  'carbs_g_secured_max':['exact']}

    def MyPropertyFilter(self, queryset, name, value):
        results = [row for row in queryset if value and row.carbs_g_secured()[0] and row.carbs_g_secured()[0] < value]
        return results

问题是它返回的是一个list,而它期望的是一个query set

web_1 | AssertionError: Expected 'FoodFilter.carbs_g_secured_max' to return a QuerySet, but got a list instead.

看来我有点困了。我认为把这个列表转换成query set是不好的做法

你们觉得怎么样? 我在往好的方向走吗?我还有20个类似的属性要过滤。我甚至在考虑将所有这些属性转换为模型字段。它们都是用食物模型的原始场进行合理演算的结果

我如何才能成功地进行此筛选并处理格式期望


Tags: namepy模型selftruereturn属性food