Django Rest框架筛选计算模型属性

Django Rest框架筛选计算模型属性,django,django-rest-framework,django-filter,django-filters,Django,Django Rest Framework,Django Filter,Django Filters,很抱歉问了个新手问题。我有以下型号: class WeightSlip(models.Model): grossdate = models.DateTimeField(auto_now=False, auto_now_add=False) grossweight = models.DecimalField(max_digits=6, decimal_places=2, default=0) taredate = models.DateTimeField(auto_now

很抱歉问了个新手问题。我有以下型号:

class WeightSlip(models.Model):

    grossdate = models.DateTimeField(auto_now=False, auto_now_add=False)
    grossweight = models.DecimalField(max_digits=6, decimal_places=2, default=0)
    taredate = models.DateTimeField(auto_now=False, auto_now_add=False)
    tareweight = models.DecimalField(max_digits=6, decimal_places=2, default=0)
    vehicle = models.CharField(max_length=12)

    @property
    def netweight(self):
        return self.grossweight - self.tareweight

    @property
    def slipdate(self):
        if self.grossdate > self.taredate:
           return grossdate.date()
        else:
           return taredate.date()
序列化程序:

class WeightSlipSerializer(serializers.ModelSerializer):

   class Meta:
      model = models.WeightSlip
      fields = ('grossdate', 'grossweight', 'taredate', 'tareweight', 'slipdate', 'netweight', 'vehicle')
      read_only_fields = ('slipdate', 'netweight')
我正在尝试使用来筛选计算出的“netweight”和“slipdate”属性:

class WeightSlipFilter(FilterSet):

   class Meta:
       model = WeightSlip
       fields = ('slipdate', 'netweight', 'vehicle')
这给了我一个错误:

TypeError: 'Meta.fields' contains fields that are not defined on this FilterSet: slipdate, netweight
除了将计算字段添加到数据库之外,是否还有其他解决方法


提前感谢。

您可以为
slipdate、netweight
创建自定义筛选器,该筛选器将在db中计算和筛选此字段。为此,您可以使用和


请注意,如果您使用的是最新版本的django filter,
filter.method
接受4个参数,如下所示:

def filter_slipdate(self, queryset, name, value):
    if value:
        queryset = queryset.annotate(slipdate=Case(When(grossdate__gt=F('taredate'), then=F('grossdate')), default=F('taredate')).filter(slipdate=value)
    return queryset

```进一步扩展答案。对于最新的django和drf版本,您可能会遇到这样的异常

例外情况

文件“/home/USER/.env/drf3/lib64/python3.7/site packages/django/db/models/query.py”,第76行,在iter setattr(对象、属性名称、行[列位置]) AttributeError:无法设置属性

使用的版本:
Django==3.1
djangorestframework==3.11.1
Django过滤器==2.3.0

对我有效的解决方案是slipdate和netweight要求在queryset中使用模型名

def filter_slipdate(self, queryset, name, value):
    if value:
       queryset = queryset.annotate(WeightSlip__slipdate=Case(When(grossdate__gt=F('taredate'), then=F('grossdate')), default=F('taredate'))).filter(WeightSlip__slipdate=value)
    return queryset

def filter_netweight(self, queryset, name, value):
    if value:
        queryset = queryset.annotate(WeightSlip__netweight=F('grossweight') - F('tareweight')).filter(WeightSlip__netweight=value)
    return queryset
    return queryset 

非常感谢,非常有帮助,因为我的大多数项目都包含对计算字段的过滤。来自django_filters.rest_框架导入(NumberFilter、DateTimeFilter,)
def filter_slipdate(self, queryset, name, value):
    if value:
       queryset = queryset.annotate(WeightSlip__slipdate=Case(When(grossdate__gt=F('taredate'), then=F('grossdate')), default=F('taredate'))).filter(WeightSlip__slipdate=value)
    return queryset

def filter_netweight(self, queryset, name, value):
    if value:
        queryset = queryset.annotate(WeightSlip__netweight=F('grossweight') - F('tareweight')).filter(WeightSlip__netweight=value)
    return queryset
    return queryset