Filtering Over multiple Databases.
rjsnh1522 opened this issue · 1 comments
rjsnh1522 commented
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 ?
rjsnh1522 commented
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