我正在使用Django附带的标准用户模型(django.contrib.auth)。我在Django应用程序中创建了一些自己的模型,并创建了这样的关系:
from django.db import models
from django.contrib.auth.models import User
class GroupMembership(models.Model):
user = models.ForeignKey(User, null = True, blank = True, related_name='memberships')
#other irrelevant fields removed from example
所以我现在可以这样做以获得用户当前的所有会员资格:
user.memberships.all()
但是,我希望能够执行更复杂的查询,如下所示:
user.memberships.all().select_related('group__name')
这很好但我想在模板中获取这些数据。尝试将这种逻辑放在模板中似乎很愚蠢(我似乎无法使其工作),所以我想创建一种更好的方法。我可以对User进行子类化,但这似乎不是一个很好的解决方案 - 我将来可能希望将我的应用程序移动到其他Django站点,并且可能是因为有任何其他应用程序分类用户我不会能够让它发挥作用。
最好在GroupMembership
内创建一个名为get_by_user(user)
的方法吗?我能从模板中调用它吗?
我很感激任何人都可以给出任何建议来构建这个 - 抱歉,如果这有点长/含糊不清。
答案 0 :(得分:3)
首先,调用select_related
并传递参数,不会做任何事情。这是一个提示应该填充缓存。
您永远不会在模板中调用select_related
,只调用视图函数。只有当你知道你需要所有相关的对象进行其他处理时。
“最好在GroupMembership中创建一个名为get_by_user(user)的方法吗?”
你有这个。我不确定它有什么问题。
GroupMembership.objects.filter( user="someUser" )
“我可以从模板中调用它吗?”
没有。这就是视图功能的用途。
groups = GroupMembership.objects.filter( user="someUser" )
然后,您将groups
对象提供给模板进行渲染。
修改强>
这是一行代码;将它包含在所有视图函数中似乎并不是一件很麻烦的事。
如果您想在每个页面上显示此内容,您有很多选择,不需要重复这行代码。
视图功能可以调用其他功能。
您可能希望尝试可调用对象而不是简单函数;这些可以子类化一个填充此信息的公共可调用对象。
您可以添加模板上下文处理器,将其放入所有呈现模板的上下文中。
您可以编写自己的装饰器,以确保在每个具有装饰器的视图功能中完成此操作。