Это модель, содержащая некоторое поле и свойство 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 похожих свойств, которые я хочу отфильтровать. Я даже рассматриваю возможность преобразования всех этих свойств в модельные поля. Все они являются результатами разумного исчисления, сделанного с исходными полями из модели питания.
Как мне удастся успешно выполнить эту фильтрацию и справиться с ожидаемым форматом?