Django -Filters: метод переопределения, чтобы разрешить фильтрацию модели свойства - PullRequest
0 голосов
/ 29 марта 2020

Это модель, содержащая некоторое поле и свойство carbs_g_secured:

Models.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'

Я хотел бы сделать несколько минут / максимальная фильтрация с django-rest-framework в свойстве carbs_g_secured. Я знаю, что не могу сделать это напрямую с Django-filters, но я пытаюсь все это переопределить.

У меня есть следующий подход:

Serializers.py

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

Views.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: Ожидается, что 'FoodFilter.carbs_g_secured_max' вернет QuerySet, но вместо этого получил список.

Так что, похоже, я немного застрял. Я думаю, что не стоит преобразовывать этот список в query set.

Что вы, ребята, думаете? Я иду хорошим путем? У меня есть еще 20 похожих свойств, которые я хочу отфильтровать. Я даже рассматриваю возможность преобразования всех этих свойств в модельные поля. Все они являются результатами разумного исчисления, сделанного с исходными полями из модели питания.

Как мне удастся успешно выполнить эту фильтрацию и справиться с ожидаемым форматом?

...