2

Concise question:
What are the advantages and disadvantages of Modeling a many-to-many relationship in Django (1.5) on an external table without using the through parameter?

Details:
Say, I have a custom User model UserProfile and I want to define a m2m relation to the same model, for example to implement a following relationship. I can define an external table (model) like so:

class Relationship(models.Model):
    """Relationship model"""
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='from_users')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='to_users')
    created = models.DateTimeField(auto_now_add=True)
    is_blocked = models.BooleanField(default=False)
    objects = RelationshipManager()

In this case should I add a m2m field to the UserProfile model as showed below ? If yes, why? I could handle all the relationships between users only using the Relationship model, isn't it?

class UserProfile(AbstractBaseUser, PermissionsMixin):
    user_following = models.ManyToManyField('self', through=Relationship, symmetrical=False, related_name='followed')
4

2 回答 2

6

首先,重要的是要区分数据库中的概念数据模型 (CDM) 和物理数据模型 (PDM)。

从概念上讲,如果您想将一个 UserProfile 链接到另一个 UserProfile,您似乎需要 2 个实体。

但从技术上(物理上),由于您正在创建多对多关系,您的系统绝对需要创建第三个数据库来存储您的 2 个用户配置文件之间的关系,否则它不能!

请注意,如果它是 OneToOne 或 OneToMany 关系,从技术上讲,2 个表就足够了(这解释了为什么这个关键字只存在于 ManyToMany 关系中)。

现在,了解 Django 试图让您的生活更轻松:您可能不关心“物理”层。例如,如果您只想知道哪个用户连接到了哪些其他用户,而没有其他信息。

-> 在这种情况下,您不必关心第三张表,这只是使您的整个工作正常的技术约束!through不需要使用关键字。在这种情况下,您在 Django 中只看到 2 个模型,但数据库中有 3 个表,即使您在 Django 中看不到它。

但在某些情况下(通常实际上),您可以使用第三个表添加有关用户之间关系的重要信息。例如,如果您想存储创建关系的日期,那么第三个表是完美的地方。

-> 这个“技术”表变成了“功能”表:您想在项目中直接使用它,因为它现在包含您需要的数据以及用户之间的关系!是时候使用through关键字在 Django 项目中定义第三个表,并将属性(如assocation_date)添加到此模型/表中。现在您在 Django 中有 3 个模型,并且在您的数据库中还有 3 个表(带有您添加的附加属性)。

另一个经典例子

一个客户可以订购 1->N 个产品。一个产品可以被 0->N 个客户订购。这显然是一种多对多关系。

如果我想存储有关订单的信息(例如总价、日期等),我可以through="Order"在定义客户和产品之间的 M2M 关系时设置一个。然后,我在 Django 中定义 Order 模型,然后宾果游戏!

于 2014-06-11T00:03:03.797 回答
0

Jacob Kaplan-Moss 描述的“通过”使用的优势:http ://www.quora.com/Django-web-framework/How-do-you-query-with-a-condition-on-a-ManyToMany-model -在-Django

于 2014-06-11T14:05:10.687 回答