Reputation: 2656
I have a very basic filter setup (using django-filter) which allows me to query my data from my django rest api using date ranges:
/api/v2/metrics/?date=2017-01-01
/api/v2/metrics/?start=2017-03-03&end=2017-04-01
/api/v2/metrics/?start=2017-03-03
etc.
My filters look something like this:
class DateFilter(filters.FilterSet):
start = filters.DateFilter(name='date', lookup_expr='gte')
end = filters.DateFilter(name='date', lookup_expr='lte')
class Meta:
model = GaData
fields = ['date']
And my API view sets are:
class GaDataViewSet(viewsets.ModelViewSet):
queryset = GaData.objects.all()
serializer_class = GaDataSerializer
filter_class = DateFilter
def get_queryset(self): # This returns metrics only for the logged in user
user_id = self.request.user.id
return GaData.objects.filter(owner=user_id)
class CountriesViewSet(viewsets.ModelViewSet):
queryset = GaCountries.objects.all()
serializer_class = GaCountriesSerializer
def get_queryset(self): # This returns metrics only for the logged in user
user_id = self.request.user.id
return GaData.objects.filter(owner=user_id)
Now, the DateFilter is linked to the GaData model, I could re-write an identical filter and link it to my other model (GaCountries) but I think that there must be a better way, so that I don't need to write the same piece of code for each model.
How can I use a filter for multiple models, or can I simply somehow overwrite the model?
Thanks
Upvotes: 0
Views: 1029
Reputation: 5740
I usually create a base filter class for these situations
class BaseDateFilter(filters.FilterSet):
start = filters.DateFilter(name='date', lookup_expr='gte')
end = filters.DateFilter(name='date', lookup_expr='lte')
class GaDataFilter(BaseDateFilter):
class Meta:
model = GaData
class GaCountriesFilter(BaseDateFilter):
class Meta:
model = GaCountries
Upvotes: 6