【发布时间】:2014-05-19 10:59:13
【问题描述】:
在我的 Django 项目中,我有一个名为 Item 的模型,它基本上存储了很多项目。我还利用 Django 内置的用户模型来允许用户注册和登录。我现在想要的是让每个用户都能够将一个项目检查为“已收集”。
我现在解决它的方式感觉不舒服,这就是为什么我问这是否是解决这个问题的好习惯?或者有什么最佳实践来解决我的问题?
这是我现在的解决方案:
from django.contrib.auth.models import User
class Item(models.Model):
...
users_collected = models.ManyToManyField(User, related_name='items_collected')
我将其用作:如果用户和项目之间存在记录,则该项目被认为是由该用户收集的。要将项目标记为已收集,我只需添加一条记录,并再次将其标记为未收集,我删除该记录。
在我的特定项目类别的详细信息模板中,如果用户收集了项目,我有以下代码显示。
{% for item in items %}
{{ item.name }} -
{% if user in item.users_collected.all %}
in collection.
{% else %}
not in collection.
{% endif %}
我主要关心的是使用这种方法来解决问题是创建的多对多表的创建和删除记录的数量,因为用户会定期检查和取消选中项目。我也不太喜欢在 Item 的模型中添加一个新字段,因为我猜这会降低它的可重用性?
【问题讨论】:
-
您能否进一步展开我也不太喜欢在项目的模型中添加新字段?你是指什么领域?我想您已经知道这一点,但
users_collected不是Item表上的实际字段。 -
是的,我指的是 users_collected。 Django 是否只创建一个新表,在其中存储对项目和用户的引用,然后从该表创建与项目和用户表的关系?
-
是的,完全正确。
users_collected将是模型 instance 上的 attribute,由 Django 为您的方便而创建。它不会是数据库 table 上的 field。
标签: django django-models django-templates