Django Rest Framework filtering calculated model property

前端 未结 3 1328
野趣味
野趣味 2021-02-13 14:17

Sorry for a newbie question. I have a following model:

class WeightSlip(models.Model):

    grossdate = models.DateTimeField(auto_now=False, auto_now_add=False)
         


        
3条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-13 14:42

    You can create custom filter for slipdate, netweight that will evaluate and filter this fields in db. For this you can use conditional expressions and F expression

    from django.db.models import F, Case, When
    
    class WeightSlipFilter(FilterSet):
        slipdate = DateTimeFilter(method='filter_slipdate')
        netweight = NumberFilter(method='filter_netweight')
    
        class Meta:
            model = WeightSlip
            fields = ('slipdate', 'netweight', 'vehicle')
    
        def filter_netweight(self, queryset, value):
            if value:
                queryset = queryset.annotate(netweight=F('grossweight') - F('tareweight')).filter(netweight=value)
            return queryset
    
        def filter_slipdate(self, queryset, value):
            if value:
                queryset = queryset.annotate(slipdate=Case(When(grossdate__gt=F('taredate'), then=F('grossdate')), default=F('taredate')).filter(slipdate=value)
            return queryset
    

提交回复
热议问题