在一个Model类表中创建一个嵌套引用

时间:2018-05-21 09:52:18

标签: django

我想制作一个有这种结构的桌子

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'到标题'

1 个答案:

答案 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,并且优选indexparent必须是唯一的,这样我们就无法定义两个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]