однонаправленные один-ко-многим и многие-ко-многим в Django - PullRequest
0 голосов
/ 07 июля 2010

Я новичок в Джанго. У меня есть 2 простых объекта, давайте назовем их - File и FileGroup: - FileGroup может содержать список файлов, отсортированных в соответствии с полем «порядок». - Каждый файл может быть связан с несколькими группами.

так что в основном таблицы БД будут: 1) Файл 2) File_Group 3) Таблица File_Group_Mapping, в которой есть столбец с именем «order» в дополнение к fk для файла и файловой группы.

Здесь существует отношение многие ко многим, но объект File не должен знать о существовании FileGroup (в моем случае это не имеет смысла)

Мои вопросы - Есть ли способ создать здесь однонаправленные отношения «многие ко многим / один ко многим»? Как я могу смоделировать это с Django?

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

class FileGroup(...):
    files = models.ManyToManyField(File, through='FileGroupMapping')

но это сделает объект File осведомленным о FileGroup.

Я также могу сделать это путем отображения таблицы File_Group_Mapping в файле моделей следующим образом -

class FileGroupMapping(...):
     files = models.ForeignKey(File)
     groups = models.ForeignKey(FileGroup)
     order = models...

Какой лучший способ сделать это через django?

Спасибо

Ответы [ 2 ]

4 голосов
/ 29 июня 2012

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

class FileGroup(models.Model):
  files = models.ManyToManyField(File, symmetrical = False)

Это должно сработать!

1 голос
/ 07 июля 2010

Ваши два подхода идентичны. За кулисами Джанго создает таблицу поиска для ManyToManyField. С точки зрения ORM вы можете поставить ManyToManyField на любую модель, хотя это имеет значение для администратора и если вы хотите использовать параметр limit_choices_to. Использование параметра «до» позволяет добавлять столбцы в таблицу поиска для дальнейшего определения взаимосвязи между двумя моделями, что в точности и делается путем создания таблицы поиска вручную.

В любом случае, вы все равно можете «получить» FileGroup, к которой принадлежит определенный файл, так как наборы запросов Django будут следовать отношениям FK в двух направлениях.

...