我有表名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/department
或city/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='')
等等
但这似乎没有效果。 我想问一下如何做到这一点会很棒???
答案 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
现在如何在您提供的链接中查询表格:
NamOfTable.objects.filter(parent_id__isnull=True)
NameOfTable.objects.filter(parent_id=id_from_ajax_call)
如果你仔细观察它会看到一些重复的代码,所以我建议将表加载到1个变量中并查询置于变量中的#2,#3,#4。 “儿童”。
最后,简短的设置: