如何设计层次结构(树)表以显示下拉菜单?

时间:2016-01-29 06:14:35

标签: python django

我有表名Layer
其中有4个字段:layer1,layer2,layer3,layer4

模型

class Layer(models.Model):
    layer1 = models.CharField(max_length=255)
    layer2 = models.CharField(max_length=255)
    layer3 = models.CharField(max_length=255)
    layer4 = models.CharField(max_length=255)

因为它不是标准格式
它可以是city/Building/Floor/departmentcity/Floor/department 这取决于用户,只有规则最多为4层

例如:

layer 1 : city A 
layer 2 : Building A
layer 3 : 12 F 

layer 1 : city A 
layer 2 : Building A
layer 3 : 10 F
layer 4 : department A 

layer 1 : city B
layer 2 : 3 F

layer 1 : city B
layer 2 : 3 F
layer 3 : department A 

并在设置之后 我们需要在网页上显示一个与下拉相关的菜单,例如enter link description here

我现在的想法是第一次查询,用户可以选择layer1

layer1 = Layer(Q~(layer1=''),layer2='',layer3='',layer4='') 

如果他选择city A,那么

layer2 = Layer(layer1='city A',Q(layer2=''),layer3='',layer4='') 

如果他选择Building A,那么

layer3 = layer2.filter(layer2='Building A',Q(layer3=''),layer4='')  

等等

但这似乎没有效果。 我想问一下如何做到这一点会很棒???

1 个答案:

答案 0 :(得分:0)

树模型的详细说明是HERE

imanigary模型我将与之合作:

class NameOfTabel(models.Model):
    """docstrings"""
    parent_id = models.ForeignKey('self', null=True, blank=True)  # For 1.7 v. In 1.9 it's slightly different
    layer = models.CharField(max_length=255)

在我们开始之前,应该在管理区域或通过预先填充的脚本填充此模型,因为如果需要,为每个层设置验证将是“很难”。

该表有3列:

id | parent_id | layer

第一层必须将parent_id字段设为空。

id | parent_id | layer
1  |           | city A

在第二层中,您必须将“建筑物A”分配给父母,即“城市A”并且它具有#1 ID。

id | parent_id | layer
2  | 1         | building A

在第三层和第四层中设置相同。

id | parent_id | layer
3  | 2         | 12 F
4  | 3         | department A

(如果某些图层可能为空,则将CharField更改为null=True。)

如果你看上面你可能会得到它为什么它被称为树。如果您认为它看起来像这样:(我添加了更多行)

city A
    building A
        12 F
            department A
    building B
        1 F
            department B
city B
    building A
        2 F
            department A

要在“终端”中显示,查询中必须有(左)联接,我希望你能做到(你有很多声誉点)。

layer1 | layer2     | layer3 | layer4
city A | building A | 12 F   | department A
city A | building B | 1 F    | department B
city B | building A | 2 F    | department A

现在如何在您提供的链接中查询表格:

  1. layer = NamOfTable.objects.filter(parent_id__isnull=True)
  2. layer = NameOfTable.objects.filter(parent_id=id_from_ajax_call)
  3. layer =与#2
  4. 相同
  5. layer =与#2
  6. 相同

    如果你仔细观察它会看到一些重复的代码,所以我建议将表加载到1个变量中并查询置于变量中的#2,#3,#4。 “儿童”。

    最后,简短的设置:

    • 首先在客户端显示第一个选择框中仅第1层,其他将被禁用
    • 选择第1层后,发送AJAX以显示子项,并在发送的数据中将是父ID
    • 在视图中,您将从发送的数据中获取父ID并查询结果,将其发回,在第2层的选择框中显示并允许(取消禁用状态)
    • 表示#3和#4层与前一点相同的步骤。