2017-01-30 2 views
1

В настоящее время я пытаюсь реализовать структуру книги в Django в модели.Структура книги в Django

структура выглядит следующим образом

Книга Класс:

название

страниц (это массив объектов страницы)

библиография (словарь названий и ссылок)

Категория:

название

секции (массив раздела объектов)

изображения (массив URL изображений)

Раздел Класс:

Название:

текст:

изображение (массив URL изображений)

видео (массив видео URLs)

Я довольно новое для Django и структурирования данных SQL. В чем конкретно заключается мой вопрос, каков был бы лучший метод, чтобы сделать db с книгами, где каждая запись содержит перечисленные выше компоненты? Я понимаю, что лучшим методом было бы иметь таблицу книг, в которой каждая запись имеет отношение «один к большому» к страницам, которые, в свою очередь, имеют отношение «один ко многим» к разделам. Но я не знаю, как объединить модели Django и как я могу включить списки объектов (важно, чтобы эти списки были динамическими).

+0

Может ли страница отображаться в нескольких книгах? Кажется маловероятным. Аналогично, может ли раздел отображаться более чем на одной странице? – ChidG

+0

У вас есть это неправильно: страница должна принадлежать книге. Это точно такая же структура, как «Вопрос и выбор» в учебнике, который вы должны прочитать. –

ответ

1

SQL не имеет никакого понятия «массив» - каждое поле в таблице атомное (содержит одно значение) - так что если вы хотите один объект A «иметь» много («массив») другой объект B вас необходимо (по крайней мере) две таблицы (одна для A и одна для B) и связь между этими таблицами. Здесь вы можете иметь два вида отношений: «один-много» и «многие-многие».

Если экземпляр B может принадлежать только к одному экземпляру A - как, например, Book - отношения>Page в вашем случае, когда Page принадлежит к одному Book (очевидно), у вас есть «один-к -many "(a Book имеет один или несколько Page, a Page принадлежит к одному Book).На уровне базы данных это материализуется таблицей page, имеющей поле внешнего ключа, указывающее на первичный ключ book, которому он принадлежит. В модели Django это делается с использованием models.ForeignKey() field.

Если экземпляр A имеет много B и экземпляр B может принадлежать многим A, у вас есть отношения многие ко многим. Это может иметь место для отношения Book ->Author (Author пишет один или несколько Book, а Book записывается одним или несколькими Author. На уровне базы данных это реализуется дополнительной таблицей, которая будет иметь внешний ключ на «книгу» и внешний ключ на «автора» (и обычно это «уникальное» противопоставление обоих ключей, поэтому вы не связываете дважды того же автора с той же книгой). В Django это делается с использованием models.ManyToManyField на любом из Book или. (NB: эксклюзивный «или») Author модели, и Джанго создаст промежуточную таблицу по себе

Таким образом, для вашего примера, вам необходимо:

  • модель «Книга»
  • модель «BibliographyItem»
  • модель «Страница» с помощью внешнего ключа на «Книга»
  • модель «Раздел» с помощью внешнего ключа на «странице»
  • модель «Image»
  • модель «Видео»

в зависимости от того, хотите ли вы, чтобы иметь возможность поделиться же BibliographyItem между книгами или нет, вы либо хотите ManyToMany поле или ForeignKey на "Book. В этом случае (и не зная больше о требованиях к вашему проекту) я предпочел бы использовать отношения ManyToMany (возможно, более чем одна книга будет ссылаться на один и тот же элемент).

То же самое для Image и Video, вы можете делиться ими между разделами или нет.

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

+0

Это было очень полезно. Огромное спасибо. – Peter

+0

Я понял, что это будут отдельные таблицы между классами/элементами, но я не знаком с некоторыми встроенными функциями Django. – Peter

+0

в качестве продолжения, если бы я хотел реализовать номера страниц, относящиеся к учебникам, в дополнение к идентификационным записям в таблице, как бы вы это сделали? – Peter

-1

Каждая модель Django - это класс, который вы импортируете в своем приложении, чтобы иметь возможность работать с ними. Чтобы объединить модели вместе, вы можете использовать внешние ключи для определения отношений, т. Е. Ваш класс страницы будет иметь внешний ключ из книги. Чтобы хранить списки в поле, одним из способов сделать это является преобразование списка в строку с использованием модуля json и определение поля в виде текстового поля. json.dumps преобразует список в строку, json.loads преобразует строку обратно в список. Или, если вы говорите о других «списках» в своем вопросе, то, возможно, все, что вам нужно, это просто набор запросов django, который вы получаете с помощью model.objects.get(). Queryset - это список строк из таблицы.

Смежные вопросы