I have a model with lots of attributes. I want to query the model by filters in attritbutes. The problems is that I have to write lots of function to query by different attributes.
models.py
class ETF(models.Model):
ticker = models.CharField(max_length=6, blank=False, db_index=True, unique=True)
full_name = models.CharField(max_length=200, blank=False)
region = models.ManyToManyField(Region)
sector = models.ManyToManyField(Sector)
industry = models.ManyToManyField(Industry)
# Even more attributes here
class Theme(models.Model):
name = models.CharField(max_length=50, blank=False, unique=True)
slug = models.SlugField(default="", null=False)
def __str__(self):
return self.name
I am writing a function to filter ETF by attritbutes. Here is Views.py:
class Categories_selector():
def __init__(self):
pass
def theme(self, category_slug):
return ETF.objects.filter(theme__slug=category_slug).order_by('-aum')
def sector(self, category_slug):
return ETF.objects.filter(sector__slug=category_slug).order_by('-aum')
def region(self, category_slug):
return ETF.objects.filter(region__slug=category_slug).order_by('-aum')
# more function here
c_object = Categories_selector()
def get_etf_list(request, categories_slug, category_slug):
filtered_results = getattr(c_object, categories_slug)(category_slug)
return render(request, "etf/list_etf.html", {
"ETFs": filtered_results
})
urls.py
path("<slug:categories_slug>/<slug:category_slug>/", views.get_etf_list)
Is there better way to do this? I feel like this is really dumb.