Как работать с круговыми отношениями в моделях Django?
Я пытаюсь написать базовую DB для предложения своих фотографий. Это кажется таким простым, но я просто не могу собраться с мыслями, несмотря на то, что думал пару недель. Я пытаюсь объединить несколько моделей, которые связываются друг с другом.
Фото: Файлы с некоторыми сохраненными данными
Person: Данные о человеке, который изображен на фотографии / имеет безумную Цитата
Quote: Что-то, что человек сказал, и что нужно прикрепить к фотографиям
(цитата не принадлежит всем фотографиям этого человека, а скорее определенному набору)
Предложение: Обзор, содержащий все цитаты с одной фотографией в качестве миниатюры и все фотографии
(на некоторых фотографиях может быть одна и та же цитата, но она должна появиться только один раз)
В качестве макета и потому что люди здесь очень любят сначала посмотреть код, я сделал вот это:
class Quote:
person = models.ForeignKey("Person")
photos = models.ManyToManyField("Photo")
class Person:
photo = models.ForeignKey("Photo")
class Photo:
pass
class Offer:
quotes = models.ManyToManyField("Quote")
photos = models.ManyToManyField("Photo")
Пожалуйста, возьмите приведенный выше код в качестве иллюстрации, потому что я уже не знаю, как с этим справиться. Я пробовал несколько разных версий, но всегда находится какой-то случай, который не покрывается. В приведенном выше примере проблема заключается в следующем: Person и Quote независимо прикреплены к Photos. Но не может быть цитаты без того, чтобы там не было Персоны. Поэтому некоторая информация удваивается и может не совпадать. Я также пытался использовать "through=" для объединения Людей и Цитат, но столкнулся с другими проблемами.
Можете ли вы порекомендовать какие-нибудь хорошие учебники или подсказать, как справиться с такими "грязными" отношениями?
Спасибо, Майкл
Надеюсь, я все правильно понял. Ниже приведена диаграмма, показывающая, как я бы создал эту структуру классов.
- Person: каждый человек имеет несколько цитат и является частью нескольких фотографий
- Фото: каждая фотография является частью нескольких фотосетов
- Цитата: каждая цитата ссылается на один фотосет
- Фотосет_Фотографии: структура "многие ко многим" для соединения нескольких фотосетов с несколькими фотографиями
- Photoset: каждый фотосет включает несколько фотографий и может быть связан с несколькими цитатами
- Оферта: одно предложение ссылается на несколько фотосетов, с этой ссылкой вы можете получить все цитаты на их фотосеты и все фотографии