将用户与ManyToMany关系中的项目相关联,最佳做法是什么?

时间:2014-05-19 10:59:14

标签: django django-models django-templates

在我的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的模型中添加一个新字段,因为我猜它会减少重复使用?

1 个答案:

答案 0 :(得分:0)

是的,我认为这代表了良好的做法。您需要持久存储UsersItems之间的关系,并且您的方法以最直接的方式执行此操作。

高数据库写入率肯定会有问题,但您如何存储此信息呢?可以设想更奇特的实现,例如,每个User都有一个位数组字段,每个Item一位,表示是否收集它。但除非你有充分的理由做这样的事情,否则我会从这种直截了当的方法开始。

我的一点建议是明确地使用M2M through表(参见documentation)。这将提高清晰度,并且随着关系变得更加复杂,可以轻松添加任何额外字段。