Как работать с круговыми отношениями в моделях 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: каждый фотосет включает несколько фотографий и может быть связан с несколькими цитатами
  • Оферта: одно предложение ссылается на несколько фотосетов, с этой ссылкой вы можете получить все цитаты на их фотосеты и все фотографии

class structure

Вернуться на верх