我在sql数据库中有3个表。我需要为这些创建django模型。
table1: Module
|modulename |moduleversion |notes |
-----------------------------------------
|M1 |1 |module 1 |
|M2 |2 |module 2 |
|M3 |1 |module 3 |
|M4 |1 |module 4 |
|M5 |3 |module 5 |
-----------------------------------------
table2: metamodule
|metamodulename |metaversion |modulename |
---------------------------------------------
|A |1 |M1 |
|B |2 |M1 |
|C |1 |M3 |
|A |1 |M4 |
|B |2 |M2 |
---------------------------------------------
table3: release
|releasenumber |notes |metamodules|
-----------------------------------------
|R1 |Rel ver 1 |A |
|R1 |Rel ver 1 |B |
|R2 |Rel ver 2 |A |
|R2 |Rel ver 2 |C |
|R3 |Rel ver 3 |C |
-----------------------------------------
这些表具有外键约束。我很困惑哪个关系模型用于创建上表的模型。
解决方案:
from django.db import models
class module(models.Model):
modulename = models.CharField(max_length=50)
moduleversion = models.IntegerField(default=0)
notes = models.CharField(max_length=50)
def __unicode__(self):
return unicode(self.modulename)
class metamodule(models.Model):
metamodulenname = models.CharField(max_length=50)
metaversion = models.IntegerField(default=0)
modulename = models.Foreignkey(module)
def __unicode__(self):
return unicode(self.metamodulename)
class release(models.Model):
releasenumber = models.CharField(max_length=2)
notes = models.CharField(max_length=50)
metamodules = models.ManytoMany(metamodule)
def __unicode__(self):
return unicode(self.releasenumber)
这里我想到了一个解决方案。 请提出您的建议和解决方案以纠正我的解决方案
答案 0 :(得分:1)
这看起来大概是正确的,但release.metmodules
应该是ForeignKey
,而不是ManyToManyField
。声明ManyToManyField
时,Django会在幕后创建一个新表来保存两个表之间的关系。
在您的情况下,这意味着release
仅包含releasenumber
和notes
字段,并且会有第四个表格用于保存metamodule
和{之间的关系{1}}。要匹配您显示的结构,只需使用release
。
要考虑的另一件事是数据是否还有其他限制。
ForeignKey
是唯一的吗?然后添加modulename
。unique=True
表格中metamodulename
和modulename
的组合是否唯一?如果是,请使用unique_together
。metamodule
和metamodules
类似。我也同意@Alp关于命名的评论。
答案 1 :(得分:0)
一些想法:
Module
,MetaModule
和Release
。按惯例,这是最佳做法。MetaModule
中,您应该将modulename
重命名为module
。Module.modulename
是多余的信息。 Module.name
足够且更具可读性。同样适用于moduleversion
(version
)或releasenumber
(number
)等属性。