Django 查询通过从 slug 中过滤不同的属性
Django query by filter different attributes from slug
我有一个有很多属性的模型。我想通过属性中的过滤器查询模型。问题是我必须写很多函数来查询不同的属性。
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
我正在编写一个函数来按属性过滤 ETF。
这里是 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)
有更好的方法吗?我觉得这真的很蠢。
您可以同时查询这些:
def get_etf_list(request, categories_slug, category_slug):
if categories_slug in ('theme', 'sector', 'region'):
return ETF.objects.filter(
**{f<strong>'{categories_slug}__slug'</strong>: category_slug}
).order_by('-aum')
return render(request, "etf/list_etf.html", {
"ETFs": filtered_results
})
else: # return an error page
pass
我有一个有很多属性的模型。我想通过属性中的过滤器查询模型。问题是我必须写很多函数来查询不同的属性。
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
我正在编写一个函数来按属性过滤 ETF。 这里是 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)
有更好的方法吗?我觉得这真的很蠢。
您可以同时查询这些:
def get_etf_list(request, categories_slug, category_slug):
if categories_slug in ('theme', 'sector', 'region'):
return ETF.objects.filter(
**{f<strong>'{categories_slug}__slug'</strong>: category_slug}
).order_by('-aum')
return render(request, "etf/list_etf.html", {
"ETFs": filtered_results
})
else: # return an error page
pass