【问题标题】:Relate users to items in a ManyToMany relation, what is best practice?将用户与多对多关系中的项目相关联,最佳实践是什么?
【发布时间】: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


【解决方案1】:

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

高数据库写入率肯定会带来问题,但是您还能如何存储这些信息呢?可以想象更多奇特的实现,例如,每个User 都有一个位数组字段,每个Item 一个位指示它是否被收集。但除非你有充分的理由去做这样的事情,否则我会从这种简单的方法开始。

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

【讨论】:

  • 感谢您的回答!当您这样说时,我想很难以任何其他易于实现的方式来做到这一点。我也会看看 M2M。
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多