Django самореферентна връзка?

Опитвам се да създам моделна страница, страницата трябва да може да има и „дъщерни страници“.

Кодът на моя модел по-долу поддържа срив на Python на моя Mac (python 2.6.1) и Ubuntu 10.04 (python 2.6.5):

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 изобразяване принадлежи към изгледи?

Благодаря.


person Community    schedule 28.12.2010    source източник
comment
Броят на PyEval_EvalFrameEx извикванията в проследяването на стека може да доведе до препълване на стека. Изглежда много като грешка в Python, защото обикновено Python би нарушил рекурсията в даден момент с RuntimeError: maximum recursion depth exceeded.   -  person AndiDog    schedule 28.12.2010
comment
Малък коментар за вашия модел: релацията много към много вероятно е грешното представяне. В дърво възел (или във вашия код страница) има само нула или един родител. Външен ключ parent би бил по-доброто представяне.   -  person Benjamin Wohlwend    schedule 28.12.2010
comment
@piquadrat Благодаря, че забеляза. Обвинявам сънливостта.   -  person    schedule 28.12.2010


Отговори (2)


Предлагам ви да използвате django-mptt, който предлага по-лесен за използване метод за рекурсивно изплюване на структурата.

Все пак трябва да регистрирате mptt с модела първо.

Ето моят код, който го използва: Включване на брой външни ключове в django mptt пълен списък на дърво?

person meder omuraliev    schedule 28.12.2010
comment
Работи перфектно и лесен за използване. Благодаря. - person ; 28.12.2010

По отношение на самия модел, вие просто мислите за това в грешна посока. Вместо

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

използване

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

Това ще ви позволи достъп до децата директно от запис на страница, но трябва да бъде по-ясно представяне в базата данни.

HTML изобразяването обикновено трябва да се извършва в изгледи, а не в модела. Използвайте mptt, както предлага meder.

person Jordan Reiter    schedule 28.12.2010