我有一个Django论坛,用户在论坛上发表评论并相互交流。每个人都有一个昵称,每个评论可以写250个字符。此外,还提供了上票/否决功能来规范评论的质量。
此外,一些*经过验证的*用户会得到徽章。目前只有一种类型的徽章,并分发给具有某种实际技能的用户(我们通过背景调查来验证这一点)。
每个徽章只显示一个*旁边的一个人的昵称。例如:
mhb11:你看过即将上映的内战电影的评论了吗?这里:链接 Swindon-411*:我打赌BvS > MCW :-D samantha1:哦,天哪!
上面的Swindon-411*就是其中一个经过验证的用户。我在nicknames.py中列出了所有已验证的昵称,然后将列表导出到views.py。然后,在项目的每个Django模板中,我都这样做:
{% for person in verified %}
{% if person == comment.submitter.username %}
<span style="color:orange;"><b>*</b></span>
{% endif %}
{% endfor %}我的大多数模板都包含这个逻辑(模板不应该包含这个逻辑)。该项目规模很小,因此这一方法具有典型的工作效果。现在我们的用户已经扩展了,我们也增加了更多的徽章。我想重构一下我实现这个方法的方式。
在我的Django web应用程序中,实现这一点的最不需要性能的、可伸缩的方法是什么?我应该有一个中间件来读取每个请求,并在昵称旁边连接一个徽章吗?我应该把它作为一个属性搬到DB吗?我的应用程序中的每个User都来自django.contrib.auth.models。
对我来说最好的答案是一个概述你将如何去做的答案,还有一个说明性的例子。我使用Django < 1.8,我的后端是PostgreSQL。提前谢谢。这个项目让我学到了很多东西,这里的学习还在继续。
发布于 2016-05-03 04:03:46
海事组织,你绝对应该把它移到你的数据库里。手动维护列表现在似乎是个好主意,但不能扩展,以后不可避免地会引起头痛。
最简单的方法是创建一个UserProfile模型(见文档),该模型可用于存储此信息和任何其他用户信息:
from django.conf import settings
class Profile(models.Model):
# Tie this profile to a specific user.
# You may need to set null=True if migrating a bunch of existing users
# who don't have a profile.
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
verified = models.BooleanField(default=False)然后您可以使用标准的反向关系从任何地方访问它:
{% if person.profile.verified %}
<span style="color:orange;"><b>*</b></span>
{% endif %}还应该确保将适当的select_related调用添加到查询集中,以便在同一个DB查询中获取用户和概要文件。
https://stackoverflow.com/questions/36994980
复制相似问题