在我的Django项目中,我有一个名为Item的模型,它基本上存储了很多项目。我还使用Django内置的User模型来允许用户注册和登录。我现在想要的是每个用户能够检查项目"收集"。
我对我现在解决的方式感到不舒服,这就是为什么我会问这个问题是否适合这个问题?或者有什么最佳实践来解决我的问题?
这是我现在的解决方案:
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 %}
使用此方法解决问题的主要问题是创建的ManyToMany表的创建和删除记录的数量,因为用户将定期检查和取消选中项目。我不是很想在Item的模型中添加一个新字段,因为我猜它会减少重复使用?
答案 0 :(得分:0)
是的,我认为这代表了良好的做法。您需要持久存储Users
和Items
之间的关系,并且您的方法以最直接的方式执行此操作。
高数据库写入率肯定会有问题,但您如何存储此信息呢?可以设想更奇特的实现,例如,每个User
都有一个位数组字段,每个Item
一位,表示是否收集它。但除非你有充分的理由做这样的事情,否则我会从这种直截了当的方法开始。
我的一点建议是明确地使用M2M through
表(参见documentation)。这将提高清晰度,并且随着关系变得更加复杂,可以轻松添加任何额外字段。