Джанго: поддержание отдельных наборов объектов, почти как «дети» - PullRequest
0 голосов
/ 05 декабря 2010

В настоящее время я начинаю понимать некоторые тонкости Джанго и начинаю использовать их всерьез. У меня есть пример, где у меня есть несколько отношений внешних ключей, и я хочу сохранить объекты отдельно. Вот быстрый models.py пример:

class CopyOfBook(models.Model):
    barcode = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    copies = models.ManyToManyField(CopyOfBook)

class Library(models.Model):
    name = models.CharField(max_length=100)
    books = models.ManyToManyField(Book)

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

Проблема в том, что если вы откроете администратор и добавите новую Книгу, вам будет представлен список всех экземпляров CopyOfBook, а не только тех, которые принадлежат этой книге (которая при добавлении новой). , будет пустой список).

Надеюсь, я объяснил это достаточно ясно, дайте мне знать, если вам нужны какие-либо разъяснения.

Обновление: Я пытался использовать ManyToMany.limit_choices_to и использовать соответствующие related_name в аргументах, но без особой радости.

Ответы [ 3 ]

1 голос
/ 05 декабря 2010

Вы должны начать думать о своей модели сущности-отношения.

CopyOfBook имеет одну книгу и одну библиотеку. Таким образом, вы можете дать ему ForeignKey для каждого.

Книга и библиотека подключаются только через CopyOfBook. Таким образом, хотя это не является строго обязательным (достаточно двух приведенных выше ForeignKey), вы можете дать Библиотеке отношение ManyToMany с Book через through = CopyOfBook.

0 голосов
/ 05 декабря 2010

Отношения ManyToMany, которые у вас есть между Library и Book, хороши, потому что более чем одна библиотека может иметь одну книгу.Тем не менее, отношения ManyToMany, которые у вас есть между Book и CopyOfBook, не имеют смысла для меня.Конкретная копия может быть конкретной книги.Вместо этого у вас должно быть отношение many-to-one (ForeignKey), которое связывает конкретную книгу с более чем одной ее копией.

0 голосов
/ 05 декабря 2010

Если книга относится к одной библиотеке, вы должны иметь ForeignKey для библиотеки на ней, чем ManyToManyField в Library. Также я полагаю, что CopyOfBook также будет характерно для отдельной книги, поэтому то же самое применимо и здесь!

Затем вы можете администрировать книги и копии с помощью InlineModelAdmins !

...