[英]django model designing for 3 linked lists
我打算在Django中设计一个基于Web的数据库。 在我的页面上,所有议会问题著作都是自动完成的。 这是表的样本:
在我的输入表格中,将有许多字段,包括部和司字段。 如上表所示,当我选择第1组时,所有三个部委A,B,C都将作为下拉列表进入“部委”字段下。 同样,当我从下拉菜单中选择A部时,所有三个X,Y,Z分区都将位于“分区”下拉列表的标签下。 请注意,您可能会注意到所有部门都没有部门。 因此,当一个部门没有部门时,部门字段将被隐藏。
为此,我正在考虑以下模型:
from django.db import models
class Group(models.Model):
name = models.CharField(max_length=8, unique=True)
slug = models.SlugField(max_length=8, unique=True,
help_text='A label for URL config.')
class Ministry(models.Model):
name = models.CharField(max_length=90, unique=True)
slug = models.SlugField(max_length=90, unique=True,
help_text='A label for URL config.')
group = models.ForeignKey(Group)
class Division(models.Model):
name = models.CharField(max_length=90, unique=True)
slug = models.SlugField(max_length=90, unique=True,
help_text='A label for URL config.')
ministry = models.ForeignKey(Ministry)
我的方法正确吗? 欢迎任何改进建议。
编辑:
django-mptt型号:
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from django.core.urlresolvers import reverse
class Genre(MPTTModel):
name = models.CharField(max_length=50, unique=True)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
def get_absolute_url(self):
return reverse('genre_detail', kwargs={'pk': self.pk,})
class MPTTMeta:
order_insertion_by = ['name']
def __str__(self):
return self.name
django-mptt输出:
Group-1
Ministry A
Division A
Division B
Division C
Ministry B
Ministry C
Division D
Division E
Ministry D
Group-2
Ministry E
Division G
Division Z
Ministry F
Division I
Division J
但是如何使这棵树作为嵌入式表成为我的样本表呢?
我会再使用一种模型,例如
class MyRecord(models.Model): #please pick a better name
group = models.ForeignKey('Group')
ministry = models.ForeignKey('Ministry')
division = models.ForeignKey('Division', null=True)
现在每一行将包含对数据的3个引用...
您的表将如下所示:
ID | 集团| 事工| 部门|
1 | A | M1 | D2
2 | A | M2 | D3
2 | B | M2 | D3
等等...
如果我从您的评论中很好地理解了您,那么级别将比您的问题(组,部门,部门)中列出的三个级别还要多。在这种情况下,最简单的选择就是只使用一张表格,您可以在其中保存组的名称和其他属性,还有parent_id-包含该组的组的ID。因此,它看起来像这样:
from django.db import models
class Group(models.Model):
name = models.CharField(max_length=8, unique=True)
slug = models.SlugField(max_length=8, unique=True,
help_text='A label for URL config.')
parent = models.ForeignKey(Group, null=True)
#Other fields of the model...You could define attributes like
#level which would define on which level is this group
#boolean attribute representing whether this group is leaf element or not and others
通过这样做,您可以拥有使用3个表定义的3个以上的层次结构级别。 因此,在这种情况下,所有条目都将分配有parent_id(顶级实例除外-或在您的示例组1,组2,组3中),例如,在示例中使用SQL查询列出“组1”的所有子组将是:
SELECT g1.name AS level1, g2.name as level2, g3.name as level3
FROM groups AS g1
LEFT JOIN groups AS g2 ON g2.parent_id = g1.id
LEFT JOIN groups AS g3 ON g3.parent_id = g2.id
WHERE g1.name = 'Group 1';
有关此方法的更多信息,请参见https://en.wikipedia.org/wiki/Adjacency_list
您可以在此处使用的另一种方法是关闭表,您可以看一下: http : //technobytz.com/closure_table_store_hierarchical_data.html
希望这对您有所帮助,并祝您好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.