鉴于以下型号:如何访问模板中的自定义反向模型管理器?
class Author(models.Model):
name = models.CharField(max_length=20)
class CustomQuerySet1(models.QuerySet):
def some_method(self):
return 'custom queryset 1'
class CustomQuerySet2(models.QuerySet):
def some_method(self):
return 'custom queryset 2'
class Book(models.Model):
author = models.ForeignKey(Author, related_name='books')
title = models.CharField(max_length=50)
objects = models.Manager()
custom1 = CustomQuerySet1.as_manager()
custom2 = CustomQuerySet2.as_manager()
在我REPL我可以访问自定义,像这样的相关管理人员:
>>> author = Author.objects.create(name='John')
>>> book = Book.objects.create(author=author, title='Hello')
>>> author.books(manager='custom1').some_method()
'custom queryset 1'
>>> author.books(manager='custom2').some_method()
'custom queryset 2'
而且在我们的模板,我们通常是通过默认的管理员访问相关的对象,像这样:
{% for book in author.books.all %}
{{ book.title }}
{% endfor %}
我们显然不允许进行函数调用并传递模板中的参数:
{% for book in author.books(manager='custom1').some_method %}
{% endfor %}
那么是否有一种本地方式来访问我不知道的模板中的这些自定义相关模型管理器?有没有这样的想法?任何外箱解决方案?
编辑: 如果有意见中的一些困惑,我是不是提示如下:
def some_view(request):
context = {}
template = 'my_template.html'
context['author'] = Author
return render(request, template, context)
,然后调用author.objects.all
而是:
def some_view(request):
context = {}
template = 'my_template.html'
author = Author.objects.get(name='John')
context['author'] = author
return render(request, template, context)
,然后访问author.books.custom1.some_method
。请注意0模型上定义的author
上的related_name
。
我不认为这是可能的atm。你可以做的是在视图中创建查询集并将其传递给模板。它实际上是首选的方式,因为概念上模板不应触发查询。 – spectras
从我所看到的我不认为这是可能的。鉴于查询集是懒惰的,模板不会始终触发查询?不会阻止模板中的查询属于'select_related'和'prefetch_related'之类的东西吗? –
关键是视图负责创建它,而不是模板。确实,他们很懒,所以模板评估会触发它们,但这是一个实现细节。例如,模板可能在'all_books'上循环,但是视图需要定义什么是'all_books'。 – spectras