我计划在django中设计一个基于Web的数据库。在我的页面中,所有议会问题的作品都是自动化的。这里有一个表格样本:
在我的输入表格中,许多字段将包括部门和部门字段。如上表所示,当我选择第1组时,所有三个部门A,B,C将作为下拉列表进入部门领域。再次当我从下拉列表中选择A部时,所有三个X,Y,Z分区都将在Division下拉列表的标签下。请注意,您可能会注意到所有部门都没有部门。因此,当一个部门没有部门时,部门领域将被隐藏。
为实现这一点,我想到以下模型:
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 models:
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
但是如何使这个树成为内联表作为我的样本表?
答案 0 :(得分:0)
我会再使用一个型号,例如
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
依旧......
答案 1 :(得分:0)
如果我从你的评论中理解你的话,那么你的问题(小组,部门,分部)中列出的级别将会超过这三个级别。在这种情况下,最简单的灵魂就是只使用一个表格,其中您将保存组的名称和其他属性以及 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(顶级实例除外 - 或者在您的示例中为Group 1,Group2,Group3) 因此,例如,在您的示例中列出“组1”的所有子组的SQL查询将是:
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
希望这有帮助,祝你好运!