2015-12-05 2 views
1

С самого начала, я чувствую, что мне не хватает чего-то простого - если это так, пожалуйста, укажите мне в правильном направлении. Ниже приводится минимальное объяснение моей проблемы:Добавить информацию к экземпляру модели, указанному в 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 - в идеале в раскрывающемся списке должны отображаться только статьи из выбранного журнала)

А также, чтобы убедиться, что есть только одна заметка для каждой статьи + комбинация статей (возможно, одна из них без какой-либо связанной статьи)?

ответ

1

Это легче сделать с помощью формы Форма.

Для получения точного значения на уровне требуется дополнительная работа.

Поэтому я рекомендую этот превосходный 3-й пакет партии: django-smart-selects

Пример из Readme.

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model): 
    continent = models.ForeignKey(Continent) 
    country = ChainedForeignKey(
     Country, 
     chained_field="continent", 
     chained_model_field="continent", 
     show_all=False, 
     auto_choose=True 
    ) 
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country") 
    city = models.CharField(max_length=50) 
    street = models.CharField(max_length=100) 

Я использую его в производстве с хорошими результатами. Я рекомендую установить параметры JQUERY для использования более новой версии jQuery.

+0

Примечание: если вы используете Django 1.9, вам нужно сделать одно [небольшое изменение] (https://github.com/PetrDlouhy/django-smart-selects/commit/d65f80980710771d4dce413b42d3c062c1ec55b4), которое не было принято пакет поддержки. –

+0

К моему удивлению, существование такой сторонней библиотеки указывает, что моя проблема действительно действительна, и у других людей одинаковые потребности. Я предполагаю, что есть функция базы данных/структуры, которую я пропускаю. Благодарим вас за то, что вы указали этот проект. Это должно быть полезно. – zencodism

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