2010-12-28 23 views
6

Estoy intentando crear una página modelo, la página también debería poder tener "páginas secundarias".¿Relación autorreferencial de Django?

Mi código siguiente modelo mantiene crashing Python en mi Mac (Python 2.6.1) y 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) 

¿Qué estoy haciendo mal? ¿O este tipo de procesamiento de HTML pertenece a las vistas?

Gracias.

+0

El número de llamadas 'PyEval_EvalFrameEx' en el seguimiento de la pila podría haber llevado a un desbordamiento de la pila. Se parece mucho a un error de Python, porque normalmente Python rompería la recursión en algún momento con 'RuntimeError: se excedió la profundidad de recursión máxima'. – AndiDog

+0

Un pequeño comentario sobre su modelo: una relación de muchos a muchos probablemente sea la representación incorrecta. En un árbol, un nodo (o en su código, una página) solo tiene cero o uno principal. Una clave extranjera 'padre' sería la mejor representación. –

+0

@piquadrat Gracias por notarlo. Yo culpo a la somnolencia. – jussi

Respuesta

13

En términos del modelo en sí mismo que sólo está pensando en esto en la dirección equivocada. En lugar de

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

uso

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

Esto le permitirá acceder a los niños directamente desde un registro página, pero debe ser una representación más directa en la base de datos.

La representación de HTML generalmente debe realizarse en vistas, no en el modelo. Use mptt como lo sugiere Meder.

Cuestiones relacionadas