django模型设计3链表

时间:2016-05-05 13:33:05

标签: django python-3.x django-models django-forms

我计划在django中设计一个基于Web的数据库。在我的页面中,所有议会问题的作品都是自动化的。这里有一个表格样本:

enter image description here

在我的输入表格中,许多字段将包括部门和部门字段。如上表所示,当我选择第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

但是如何使这个树成为内联表作为我的样本表?

2 个答案:

答案 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

希望这有帮助,祝你好运!