Как мне добавить несколько книг в книжный магазин в форме администратора

#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, чтобы одна и та же книга могла продаваться во многих книжных магазинах, и каждый книжный магазин может продавать много разных книг.