Django 模型与多个类的关系

Posted

技术标签:

【中文标题】Django 模型与多个类的关系【英文标题】:Django Model Relationship with Multiple Classes 【发布时间】:2016-11-13 22:27:13 【问题描述】:

肯定有答案,但我一直在努力寻找搜索词!这是我的第一个 Django 项目,我似乎无法想出一个逻辑模型结构......

Domain-->* Region-->* [Domain]Network

在一个中有多个区域,每个区域可以有多个网络(应该只属于底层特定模型,因为每个都有特定的网络布局)。 每个Network都有自己的特定字段(虽然也有一些共同点,所以可以通过某种方式继承吗?)

未来将创建更多(以及网络),因此应该能够扩展。 区域可能会重叠(因此 Region2 也可能在 DomainABC 中)但同样会应用特定于域的网络。

示例:

如果域是 ABC,您应该只能将 ABCNetworks 与该域中的区域相关联。同样,XYZ 域应包含只能具有 XYZ 网络的区域。

域XYZ:

区域 1 XYZNetwork1 XYZNetwork2 XYZNetwork3 区域 2 XYZNetwork4 XYZNetwork5 区域 3 XYZNetwork6 XYZNetwork7

域ABC:

区域 101 ABCNetwork1 ABCNetwork2 ABCNetwork3 区域 102 ABCNetwork4 ABCNetwork5 区域 103 ABCNetwork6 ABCNetwork7

创建域时可能会出现一个下拉菜单以选择网络模型(OneToOne?),然后强制区域只能创建 [域] 网络? 还是只是彻底重新思考!?

代码:

class Domain(models.Model):
    domain_name = models.CharField(max_length=20)

    def __str__(self):
        return self.domain_name


class Region(models.Model):
    domain = models.ForeignKey(Domain, on_delete=models.CASCADE)
    region_name = models.CharField(max_length=20)

    def __str__(self):
        return self.region_name


class XYZNetwork(models.Model):
    region = models.ForeignKey(Region, on_delete=models.CASCADE)
    network_name = models.CharField(max_length=3)
    network_data = models.GenericIPAddressField()
    useless_number = models.IntegerField()
    network_secondary = models.GenericIPAddressField()
    crazy_network = models.GenericIPAddressField()

    def __str__(self):
        return self.network_name


class ABCNetwork(models.Model):
    region = models.ForeignKey(Region, on_delete=models.CASCADE)
    network_name = models.CharField(max_length=3)
    network_data = models.GenericIPAddressField()

    def __str__(self):
        return self.network_name

【问题讨论】:

你有什么问题?你已经有一堆模型了。这些有什么问题? 如何将域绑定到网络?此刻,我可以为 XYZ 域创建 ABCNetworks,反之亦然。或者这应该只是一个前端限制?我猜它看起来不太对... 【参考方案1】:

如果我理解您的问题,我会在您的Domains 中添加一些验证。 见:https://docs.djangoproject.com/en/dev/ref/forms/validation/

【讨论】:

谢谢,但有没有办法可以将域“链接”到网络。例如,如果我要计算一个区域中的网络,我必须为每个 [域] 网络模型编写不同的函数。并硬编码要查找的模型,因此一个用于self.abcnetwork_set.all(),一个用于self.xyznetwork_set.all() 等等。【参考方案2】:

要回答“如何继承公共字段”的问题,请使用“abstract=True”,请参阅此示例https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes

【讨论】:

谢谢,我想会有一些继承,我试试看!

以上是关于Django 模型与多个类的关系的主要内容,如果未能解决你的问题,请参考以下文章

Django模型与多个模型的关系

Django:无法创建与一个普通模型具有一对一关系的多个模型对象

Django模型:同一模型类的对象之间的一对一关系[重复]

Django中ORM模型总结[模型类的对应关系,模型类的属性,字段类型]

跨多个模型定义关系 - Django

django模型引用其他类的对象