#python #django
#python #django
Вопрос:
В django представьте, что у меня есть модельный книжный магазин и модельная книга, у которой есть внешний ключ к модели книжного магазина. В администраторе django я добавил около 10 книг, а в книжном магазине я хочу назначить несколько книг этому одному книжному магазину. Как мне это сделать? Потому что даже с помощью ForeignKey, редактируя книжный магазин, я могу выбрать только одну книгу…
class BookStore(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
name = models.CharField(max_length=100)
store = models.ForeignKey(BookStore, null=True)
Ответ №1:
Ваши отношения неправильный путь. Если в вашем книжном магазине есть fk для книги, вы говорите, что «каждый книжный магазин может хранить только одну книгу». Вместо этого у вас должен быть fk из книги в книжный магазин. Это говорит о том, что «книга принадлежит книжному магазину (и только одному книжному магазину)»
class Book:
bookstore = models.ForeignKey("Bookstore")
class Bookstore:
...
Вам нужно использовать встроенную форму, если вы хотите добавить несколько книг при редактировании вашего объекта bookstore:
class BookInline(admin.StackedInline):
model = Book
class BookstoreAdmin(admin.ModelAdmin):
model = Bookstore
inlines = [BookInline,]
Комментарии:
1. Нет, вы сказали «модельный книжный магазин, у которого есть внешний ключ для модели книги». На данный момент ваша
Book
модель имеет внешний ключ кBookstore
. Ваш код и текст противоречат друг другу.2. спасибо 🙂 . Еще одна вещь, а что, если я хочу круговое отношение? где у книжного магазина также есть внешний ключ к книгам? это правильный путь? чтобы просто добавить поле foreignkey?
3. Django автоматически обеспечивает обратные отношения. Вы можете сделать
bookstore.books_set.all()
, чтобы получить все книги в книжном магазине. Вы также можете назвать это как-то более разумно, используя поле related_name в определении ForeignKey, поэтому, если вы это сделаетеbookstore = ForeignKey(BookStore, related_name='books')
, вы можете ссылаться на книги какbookstore.books.all()
4. Тем не менее, то, как у вас сейчас обстоят дела, каждая книга может продаваться только в одном магазине. Вы можете рассмотреть возможность использования поля ManyToMany, чтобы одна и та же книга могла продаваться во многих книжных магазинах, и каждый книжный магазин может продавать много разных книг.