С самого начала, я чувствую, что мне не хватает чего-то простого - если это так, пожалуйста, укажите мне в правильном направлении. Ниже приводится минимальное объяснение моей проблемы:Добавить информацию к экземпляру модели, указанному в ManyToMany в Django
Есть модели для журнала, статьи и примечания, которые представляют собой примечание редактора к опубликованной статье. Статья не может быть опубликована вообще, может быть опубликована в нескольких журналах; также очевидно, что Журналы могут публиковать несколько статей. Поэтому для начала у нас есть:
class Article(models.Model):
(author, date of creation, actual text, etc)
class Journal(models.Model):
(edition number, title, staff, etc)
articles = models.ManyToManyField(Article)
До сих пор это стандарт. Теперь мне нужно добавить примечание к опубликованной статье - скажем, краткий обзор или комментарий редактора. Примечание должно быть связано с одной опубликованной статьей и определенным журналом (в одной и той же статье могут быть разные заметки в разных журналах). Наконец, примечание может быть связано только с журналом, а не с какой-либо статьей - в этом случае оно будет представлять собой предисловие к вопросу. До сих пор у меня есть это:
class Note(models.Model):
journal = models.ForeignKey(Journal)
article = models.ForeignKey(Article, null=True, blank=True)
text = models.TextField()
(other stuff, irrelevant)
С помощью этой установки мы знаем наверняка, что каждая нота имеет журнал ссылок и может иметь ссылку на статью или нет. Однако теперь можно добавить примечание к статье, не опубликованной в определенном журнале, и подключить ее к этому «неправильному» журналу. И здесь моя голова вращается.
Как обеспечить, чтобы это новое примечание можно было создать только в связи со статьей в списке статей журнала? (также в администраторе django - в идеале в раскрывающемся списке должны отображаться только статьи из выбранного журнала)
А также, чтобы убедиться, что есть только одна заметка для каждой статьи + комбинация статей (возможно, одна из них без какой-либо связанной статьи)?
Примечание: если вы используете Django 1.9, вам нужно сделать одно [небольшое изменение] (https://github.com/PetrDlouhy/django-smart-selects/commit/d65f80980710771d4dce413b42d3c062c1ec55b4), которое не было принято пакет поддержки. –
К моему удивлению, существование такой сторонней библиотеки указывает, что моя проблема действительно действительна, и у других людей одинаковые потребности. Я предполагаю, что есть функция базы данных/структуры, которую я пропускаю. Благодарим вас за то, что вы указали этот проект. Это должно быть полезно. – zencodism