繁体   English   中英

django模型设计用于3个链表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM