我想制作一个有这种结构的桌子
1. urls
2. views
3. models
4. templates
4.1 html
4.2 format
4.3 test
html,格式和测试与其他人生活在同一级别,但引用了4.模板
我可以从简单易用的模型开始:
class Topic(models.Model):
"""A topic the user is learning about."""
title = models.CharField(max_length=200)
sub_title = models.CharField(max_length=200)
如何参考' sub_title'到标题'
答案 0 :(得分:0)
这看起来像树状结构。树基本上是一组节点(此处为主题),其中节点最多只能有一个父节点。父关系中没有循环(因此节点的祖父母本身不能成为自己)。
可以通过添加对父级的引用来定义这种树状结构,并且该引用可以是None
(对于顶级节点)。所以我们可以用以下方式对此进行建模:
class Topic(models.Model):
"""A topic the user is learning about."""
title = models.CharField(max_length=200)
parent = models.ForeignKey(
'Topic',
on_delete=models.SET_NULL,
null=True,
default=None,
)
由于您的主题也有索引编号,这意味着我们可以添加带有索引的IntegerField
,并且优选index
和parent
必须是唯一的,这样我们就无法定义两个4.2
s:
class Topic(models.Model):
"""A topic the user is learning about."""
index = models.IntegerField()
title = models.CharField(max_length=200)
parent = models.ForeignKey(
'Topic',
on_delete=models.SET_NULL,
null=True,
default=None,
)
class Meta:
unique_together = (('parent', 'index'),)
ordering = ('index',)
现在我们用以下方式对层次结构进行建模:
Topic.objects.create(index=1, title='urls')
Topic.objects.create(index=2, title='views')
Topic.objects.create(index=3, title='models')
templates = Topic.objects.create(index=4, title='templates')
Topic.objects.create(index=1, title='html', parent=templates)
Topic.objects.create(index=2, title='format', parent=templates)
tests = Topic.objects.create(index=3, title='tests', parent=templates)
现在我们可以通过调用.parent
:
tests.parent # templates
我们还可以使用.topic_set
获取(有序)子主题集:
templates.topic_set # queryset with [html, format, tests]