Как подходить к сложным круговым отношениям между моделями?
Я пытаюсь создать базу данных для своих медиафайлов, но не могу найти способ перевести данные в модели и полезные, но не избыточные отношения.
На стороне СМИ есть фото и видео в качестве моделей.
class Photo(MediaFile):
file = UniqueNameImageField(upload_to="photos/")
preview = UniqueNameImageField(upload_to="previews/", blank=True)
thumbnail = models.ImageField(upload_to="thumbnails/", blank=True)
mediatype = "photo"
class Video(MediaFile):
file = UniqueNameFileField(upload_to="videos/")
preview = UniqueNameFileField(upload_to="previews/", blank=True)
thumbnail = models.ImageField(upload_to="thumbnails/", blank=True)
mediatype = "video"
...
В качестве метаданных я хочу хранить персоны, цитаты и релизы (контракты с появляющимся человеком).
class Person(models.Model):
name = models.CharField(max_length=255)
age = models.IntegerField(null=True, blank=True)
city = models.CharField(max_length=255, blank=True)
district = models.CharField(max_length=255, blank=True)
occupation = models.CharField(max_length=255, blank=True)
def __str__(self):
return " ".join([self.name, "("+str(self.age)+")", self.city])
class Release(models.Model):
person = models.ForeignKey("Person", on_delete=models.PROTECT)
file = models.FileField(upload_to="release_docs/")
class Quote(models.Model):
person = models.ForeignKey("Person", on_delete=models.PROTECT)
#alternative by-line if it should not be name+age
alt_by = models.CharField(max_length=255)
text = models.TextField()
Каждый релиз должен быть связан с человеком. Каждая цитата должна быть привязана к человеку.
Но тогда каждое лицо, релиз и цитата будут привязаны к фотографиям и видео.
Сложность заключается в следующем: Не каждый релиз считается для каждой фотографии человека, а скорее только для определенного набора фотографий и видео.
Кроме того, цитаты не относятся к каждой фотографии и видео, на которых появляется человек, а скорее к тем, которые относятся к тому дню, когда человек был процитирован.
Это привело бы меня к тому, чтобы установить many2many отношения между релизами и фото/видео, а также many2many отношения между людьми и фото/видео, а также many2many отношения между цитатами и фото/видео...
Сейчас существует много дублирования, поскольку если релиз привязан к фотографии, то он уже содержит связь с человеком. Однако объект персоны нуждается в отдельной связи с той же фотографией.
Кроче говоря, все связано со всем, но это приводит к дублированию и, возможно, противоречивой информации в БД.
Я ищу здесь не решение этого случая, а скорее указатель в правильном направлении, как работать с такими отношениями или упростить их. Наверняка это не такая уж редкость. Как к этому подойти / на какое ключевое слово обратить внимание?
Благодарим вас за помощь.