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