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】:如果我理解您的问题,我会在您的Domain
s 中添加一些验证。
见: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:无法创建与一个普通模型具有一对一关系的多个模型对象