鉴于以下模型:
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
。请注意related_name
模型上定义的author
上的Book
。
答案 0 :(得分:0)
没有,我认为不会(因为它不应该)。 模板是最终呈现数据的地方,因此它应该全部准备好,模板标记仅用于以方便的方式呈现。
但是,对于模板过滤器来说这是一个不错的主意。