Модельный класс Django, который может иметь одно или другое отношение? - PullRequest
1 голос
/ 14 апреля 2011

Чтобы дать вам представление о проблеме, которую я пытаюсь решить, я приведу пример. Проблема в том, что между классами может быть несколько возможных отношений, и как это представить в файле моделей. На веб-сайте, посвященном покупкам, Департамент может иметь отношение «Подотдел» или «Категория». Теоретически это может означать, что в одном департаменте может быть 100 подотделов, пока у него нет категории.

например. Департамент / Категория / Элемент, Департамент / Департамент / Категория / Категория / Элемент, Департамент / Категория / Категория / Элемент ... и т. Д.

Мой вопрос, как лучше всего описать эту связь в файле Django models.py? Будете ли вы иметь два внешних ключа и один будет пустым?

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Я бы создал родительский атрибут в ваших моделях категорий и отделов, чтобы вы могли представлять иерархическую структуру.

Вы можете использовать ForeignKey в модели Отдела, чтобы позволить им указывать на другие Отделы, и вы можете использовать GenericKey в модели Категории, чтобы позволить ему указывать на Отделы или другие Категории. Например:

class Department(models.Model):
    ...
    parent = models.ForeignKey('self', ...)

class Category(models.Model):
    ...
    parent_content_type = models.ForeignKey(ContentType)
    parent_id           = models.PositiveIntegerField()
    parent              = generic.GenericForeignKey('parent_content_type', 'parent_id')

Это позволит вам представить произвольное дерево категорий под произвольным деревом отделов.

0 голосов
/ 14 апреля 2011

Вы можете использовать реализации дерева django django-mptt или django-treebeard

...