2017-08-08 5 views
0

Je fais une API Rest dans le Cadre de repos Django pour lequel j'ai un modèle qui stocke les données comme this-Filtrage des objets à travers une gamme d'attributs d'objet dans Django-repos-cadre

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) 

Maintenant, je veux obtenir tous les objets qui tombent dans une plage de commodity_year, par exemple, tous les objets dont commodity_year est compris entre 1999 et 2014 (les deux inclus). J'ai utilisé la classe Django-filter pour cela mais je n'ai pas eu de chance.

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] 

Si quelqu'un a une meilleure approche, veuillez me guider.

Répondre

0

Essayez ceci dans CommodityFilter classe:

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'] 
1

Vous pouvez filtrer avec une plage inférieure ou égale à et supérieure à.

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

ci-dessus vous donnera un queryset où commodity_year est inférieur à 2014 et supérieur à 1999. En savoir plus sur gt à django docs

Note: Je ne pense pas que la classe de filtre est nécessaire car il est une requête très simple