鑑於以下型號:如何訪問模板中的自定義反向模型管理器?
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