Модель с рекурсивным самоотношением в админке Джанго - PullRequest
2 голосов
/ 30 сентября 2011

Скажем, у нас есть модель с двумя саморекурсивными отношениями:

class Article(Item): # Item in this case is an abstract class
    date = models.DateField()
    parent = models.OneToOneField('self', null=True, blank=True)
    subatricles = models.ForeignKey('self', null=True, blank=True, related_name='subs')

Статья действует здесь как узел - она ​​может иметь много дочерних элементов (если есть) и одного родителя (если есть).Тем не менее, когда я регистрирую свою модель в админке Django, мои подкатрилики отображаются как «один-к-одному» - в обоих случаях есть поля выбора, но в последнем множественные значения не могут быть выбраны, хотя.Я добавляю детей через панель администратора к этому объекту Article, а затем перечисляю их?

Я хотел бы иметь следующее: вместо обычного раскрывающегося списка.

Спасибо.

1 Ответ

6 голосов
/ 01 октября 2011

Вам нужно только одно поле parent с subarticles в качестве related_name для обеспечения обратного поиска:

class Article(Item): # Item in this case is an abstract class
    date = models.DateField()
    parent = models.ForeignKey('self', null=True, blank=True, related_name='subarticles')

поэтому, если у вас есть объект статьи и вы хотите получить его родительский элемент, используйте:

article.parent

если вы хотите получить своих детей, вы используете:

article.subarticles

В интерфейсе администратора для отображения субчастиц самый простой способ - использовать InlineModelAdmin :

class ArticleInline(admin.StackedInline):
    model = Article

class ArticleAdmin(admin.ModelAdmin):
    inlines = [
        ArticleInline,
    ]
...