【问题标题】:ManyToMany models relationship Django多对多模型关系 Django
【发布时间】:2019-05-09 17:31:00
【问题描述】:

我有两个模型:

class University(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=50, null=True, blank=True)
    city = models.CharField(max_length=30, null=True, blank=True)
    country = CountryField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)
    departments = models.ManyToManyField(Department)


class Department(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=50, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

我想 University 有很多 Departments ,反之亦然,效果很好。 但我也想为一所大学单独存储更多部门。

例如:

University1 有 Department1 和 Department2。

University2 有 Department1。

我希望这些部门为每所大学单独存储。现在,当我更新 Department1 时,当然每所拥有该学校的大学都会看到变化。我不想要那个。我想更新 Department1,但只更新 University1 记录。 University2 中的 Department1 不应更新。

我假设将through 选项与中间model 添加不会有帮助。最好的解决方案是什么?

【问题讨论】:

    标签: python django many-to-many


    【解决方案1】:

    关于你问题的第一部分

    But I also want to store more departments individually for one university.
    
    • 您可以创建部门并仅将其添加到您希望他们与之建立关系的大学。

    关于你问题的第二部分

    我想更新 Department1,但只更新 University1 记录。 University2 中的 Department1 不应更新

    • 您应该通过表格添加。直通表定义了两个模型之间的关系,其目的是存储每个特定关系的独特之处。

    因此,如果您想更新所有大学的 Department 1,您需要更新 Department 1 的实例。

    如果您只想在 Department 1 和 University 1 之间使用独特的东西更新 Department 1,那么这会出现在两个模型之间的直通表中。

    【讨论】:

    • 所以你是说每次大学和系之间有关系时我都应该创建新表?没有意义!如果有 1000 个关系,它将创建 1000 个表。
    • 直通表是数据库中的新表。一所大学和一个部门之间只有一种关系,您将所有对该关系唯一的关系放在该表(直通表)中。 Django 为您创建表。
    • 是的,我知道。我首先尝试过,但这不是解决方案,因为这些表仍然参考大学和学校。通过表存储2个外键,一个来自大学,一个来自学校。因此,如果每次我更新该学校时有很多行具有相同的学校外键,它将反映在任何行上,换句话说,它将反映在任何大学上。
    • 是的,如果您更新大学本身,该更新将无处不在。但是,如果您只更新该大学和系的组合所特有的某些属性的直通表,则更新将只存在于该直通表中。
    猜你喜欢
    • 2018-01-04
    • 2012-07-22
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多