philipn/django-rest-framework-filters

Filtering Over multiple Databases.

rjsnh1522 opened this issue · 1 comments

Hi ,
This framework is working fine. But I have a specific requirements where I have to fetch and filter on multiple databases.
Example:
I have 5 database and each data have same tables and column structure.
what I am doing is I loop through these database and pass on request.GET and query set to filter.
inside view

results = []
for i in dbs:
     data = MyModel.objects.using(i.db_name).all()
     my_filter_set = MyFilter(self.request.GET, queryset=data)
     seri_data = MyModelSerializer(my_filter_set.qs, many=True)
     results.append(seri_data)

Now the problem is inside filter there is dependency on other models.

class MyFilter(filters.FilterSet):
    title = filters.AutoFilter(lookups='__all__')
    model_two = filters.RelatedFilter(
        ModelTwoFilter, field_name="model_two", queryset=ModelTwo.objects.all()
    )
    model_three = filters.RelatedFilter(
        ModelThreeFilter, field_name="model_three", queryset=ModelThree.objects.all()
    )
   # like this multiple models are three.
   class Meta:
        model = MyModel
        fields = {
            "title": ["exact", "in", "startswith"],
            'model_two': ['exact', 'in'],
            'model_three': ['exact', 'in']
        }



I need to set specific database to query from inside the queryset like.
ModelTwo.objects.using(db_name).all()
is there any way to set this db_name from some where so that I can filter according to that database and merge the end result ?

solved by using example queryset callables

def get_query_set_from_model(model):
    def query_set(request):
        db = request.data['database_name']
        return model.objects.using(db).all()
    return query_set
model_two = filters.RelatedFilter(
        ModelTwoFilter, field_name="model_two", queryset=get_query_set_from_model(ModelTwo)
    )

Now when calling filter passing request in filter

self.request.data['database_name'] = database_name](url)
my_filter_set = MyFilter(self.request.GET, queryset=data, request=request)

and it is resolved