2015-02-09 4 views
0

Скажем, у меня есть модели:Джанго доступ к другой модели с помощью внешнего ключа

Class Author(models.Model): 
    id = models.PositiveIntegerField() 
    dob = models.DateField() 

Class Note(models.Model): 
    note = models.TextField() 
    author = models.ForeignKey(Author) 

Class Book(models.Model): 
    name = models.CharField() 
    pubdate = models.DateField() 
    author = models.ForeignKey(Author) 

И в admin.py:

Class BookInline(admin.StackedInline): 
    model = Book 

Class NoteInline(admin.StackedInline): 
    model = Note 

Class AuthorAdmin(admin.ModelAdmin): 
    model = Author 
    inlines = [BookInline, NoteInline] 

Class BookAdmin(admin.ModelAdmin): 
    model = Book 

Пользователи должны вводить данные со страницы AuthorAdmin, и есть встроенный для ввода данных Book.

В идеале я хотел бы, чтобы текстовое поле примечания было частью модели книги, но в большинстве случаев это вряд ли будет использоваться.

Так что я думал ради эффективности базы данных, я бы переместил ее в отдельную таблицу. При отсутствии правильной работы вложенных встроенных строк (я пробовал существующие пакеты и сталкивался с известными ошибками), работа над настройкой работает (т. Е. Имеет примечание, прикрепленное к Автору, а не книгу).

Однако, когда я использую BookAdmin, я не вижу никаких заметок (поскольку это внешний ключ для Автора, а не книги). Есть ли способ редактирования любых заметок, связанных с автором в данной книге?

Update

Основываясь на комментариях ниже, я добавил следующий внешний ключ Примечание:
Class Note(models.Model): note = models.TextField() author = models.ForeignKey(Author) book = models.ForeignKey(Book)

, а затем
Class BookAdmin(admin.ModelAdmin): model = Book inlines = [NoteInline]

Это позволяет мне получить доступ к см. поле примечаний из BookAdmin.

Однако, когда я ввожу примечание от AuthorAdmin, вместо того, чтобы показывать мне эту заметку в BookAdmin, отображается новое поле пустой заметки.

Что я делаю неправильно?

ответ

0

Я думаю, что если есть связь между книгами и заметками. Он должен быть представлен в модели домена. Если в записках всегда есть книги, тогда они должны иметь отношение к книгам, а не к авторам.

Документы предлагают использовать generic relations as an inline, но это было бы смехотворно ограниченным и приближенным.

+0

Книги не всегда будут иметь заметки, на самом деле я предполагаю, что в лучшем случае будет только 10% от всех книг. Вот почему я хотел переместить их в отдельную таблицу, а не иметь много пустых текстовых полей ... Заметки действительно связаны с книгами, но имеет смысл связать их с Автором (например, обзор книги). Есть ли другой способ связать их с книгами и по-прежнему иметь мои строки, как обсуждалось выше? – mcrsam

+0

@mcrsam У нот всегда есть связанная книга? Или автор является единственным гарантированным отношением? Чтобы это было просто, я бы просто добавил FK из книги в вашу модель заметок. Тогда ваш BookAdmin будет просто использовать NoteInline. Отношение может быть даже необязательным - при необходимости. –

+0

В идеале, заметки всегда должны иметь связанную книгу (например, заметка - это обзор книги. Так как я не могу иметь вложенные строки, это также касается ссылки на автора). Я попытался добавить FK из книги в примечание, но тогда BookAdmin NoteInline показывает новое поле примечания, а не существующую запись заметки (max_num установлен в 1) – mcrsam

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