Django自关联关系?

8 投票
2 回答
8083 浏览
提问于 2025-04-16 09:08

我正在尝试创建一个模型页面,这个页面应该能够有“子页面”。

我下面的模型代码在我的Mac(python 2.6.1)和Ubuntu 10.04(python 2.6.5)上一直让Python崩溃:

from django.db import models
from django.contrib import admin

class Page(models.Model):
    slug = models.SlugField(blank=True)
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    children = models.ManyToManyField("self", blank=True)
    published = models.BooleanField(default=True)
    created = models.DateTimeField(blank=True, auto_now_add=True)

    def html(self):
        html = "<li>"
        html += self.title

        children = self.children.all()
        if len(children) > 0:

            for page in children:
                html += page.html()

        html += "</li>"
        return html

    def __unicode__(self):
        return self.title


class PageAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}


admin.site.register(Page, PageAdmin)

我哪里做错了?或者这种HTML渲染应该放在视图里吗?

谢谢。

2 个回答

14

关于模型本身,你的思路有点偏了。不要这样想:

children = models.ManyToManyField("self", blank=True)

而是应该这样用:

parent = models.ForeignKey("self", blank=True, related_name="children")

这样做可以让你直接从页面记录中访问子项,并且在数据库中会有更简单的表示。

通常,HTML的渲染应该在视图中进行,而不是在模型里。按照建议使用mptt。

8

我建议你使用 django-mptt,这个工具可以更简单地处理树形结构的数据。

不过,你得先把 mptt 注册到你的模型里,具体可以参考 这个链接

下面是我使用这个工具的代码: 在django mptt完整树形列表中包含外键计数?

撰写回答