Django模型设计帮助三个关系表

时间:2014-07-16 21:51:33

标签: sql django django-models

我在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)

这里我想到了一个解决方案。 请提出您的建议和解决方案以纠正我的解决方案

2 个答案:

答案 0 :(得分:1)

这看起来大概是正确的,但release.metmodules应该是ForeignKey,而不是ManyToManyField。声明ManyToManyField时,Django会在幕后创建一个新表来保存两个表之间的关系。

在您的情况下,这意味着release仅包含releasenumbernotes字段,并且会有第四个表格用于保存metamodule和{之间的关系{1}}。要匹配您显示的结构,只需使用release

要考虑的另一件事是数据是否还有其他限制。

  • ForeignKey是唯一的吗?然后添加modulename
  • unique=True表格中metamodulenamemodulename的组合是否唯一?如果是,请使用unique_together
  • metamodulemetamodules类似。

我也同意@Alp关于命名的评论。

答案 1 :(得分:0)

一些想法:

  1. 始终为模型使用大写字词:ModuleMetaModuleRelease。按惯例,这是最佳做法。
  2. 外键默认使用模型ID。因此,您应该将相关列命名为模型本身。在MetaModule中,您应该将modulename重命名为module
  3. 您不需要列的描述性名称。 Module.modulename是多余的信息。 Module.name足够且更具可读性。同样适用于moduleversionversion)或releasenumbernumber)等属性。