【问题标题】:Filtering objects through a range of object attribute in Django-rest-framework通过 Django-rest-framework 中的一系列对象属性过滤对象
【发布时间】:2018-01-15 11:27:50
【问题描述】:

我正在 Django Rest Framework 中创建一个 Rest API,我有一个模型可以存储这样的数据-

   class Commodity(models.Model):
      def countryname(self):
        return self.country.country_name
      country=models.ForeignKey(Country)
      commodity_name=models.CharField(max_length=255)
      commodity_type=models.IntegerField(choices=COMMODITY_TYPE)
      commodity_year=models.IntegerField(default=None)
      commodity_production=models.IntegerField(default=None)

      def __unicode__(self):
        return self.commodity_name +"-"+str(self.country.country_name)

现在我想获取所有属于商品年份范围的对象,例如,所有commodity_year 介于 1999 年到 2014 年(包括两者)之间的对象。我一直在为此使用Django-filter 类,但没有运气。

class CommodityFilter(filters.FilterSet):
   start_date = DateFilter(name='commodity_year' )
   end_date = DateFilter(name='commodity_year')
   class Meta:
    model = Commodity
    fields =  [ 'country','commodity_name', 'commodity_type','start_date','end_date']


 class CommodityList(generics.ListCreateAPIView):

   queryset = Commodity.objects.all()
   serializer_class = CommoditySerializer
   filter_backends = (filters.DjangoFilterBackend,)
   filter_class = CommodityFilter
   permission_classes = [AllowAny]

如果有人有更好的方法,请指导我。

【问题讨论】:

    标签: django django-rest-framework django-filter


    【解决方案1】:

    CommodityFilter 类中试试这个:

    class CommodityFilter(filters.FilterSet):
        start_date = django_filters.NumberFilter(
            name='commodity_year', lookup_expr='gte')
        end_date = django_filters.NumberFilter(
            name='commodity_year', lookup_expr='lte')
    
        class Meta:
            model = Commodity
            fields =  [ 'country','commodity_name', 'commodity_type','start_date','end_date']
    

    【讨论】:

      【解决方案2】:

      您可以使用小于等于和大于等于的范围进行过滤。

      queryset = Commodity.objects.filter(commodity_year__gte=1999,
                                          commodity_year__lte=2014)
      

      上面将为您提供一个查询集,其中commodity_year 小于 2014 年且大于 1999 年。在 django 文档中阅读有关 gt 的更多信息

      注意:我认为不需要过滤器类,因为它是一个非常简单的查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 2013-11-19
        相关资源
        最近更新 更多