Django, не могу создать связь ManyToMany
В django создал две модели, между которыми установил связь ManyToMany. Вот код моделей:
class Book(models.Model):
title = models.CharField(max_length=50, default='')
price = models.IntegerField(default=0)
def __str__(self):
book_info = ('Название книги: ' + str(self.title) + ', цена: ' + str(self.price))
return book_info
class Guests(models.Model):
first_name = models.CharField(max_length=50, default='')
last_name = models.CharField(max_length=50, default='')
age = models.IntegerField(default=20)
car = models.ForeignKey(Car, on_delete=models.CASCADE, blank=True, null=True)
book = models.ManyToManyField(Book, blank=True, null=True)
def __str__(self):
guest_info = ('Фамилия: ' + str(self.last_name) + ', Имя: ' + str(self.first_name) + ', Возраст: ' + str(self.age) + ', владеет машиной: ' + str(self.car) + ', автор книги: ' + str(self.book))
return guest_info
Вот код admin.py:
class GuestsAdmin(admin.ModelAdmin):
# list_display = ('last_name', 'first_name', 'birth_date', 'age', 'sex', 'is_working')
list_display = ('last_name', 'first_name', 'age', 'car')
filter_horizontal = (['book'])
class CarAdmin(admin.ModelAdmin):
list_display = ('pk', 'brand', 'model', 'color')
class BookAdmin(admin.ModelAdmin):
list_display = ('pk', 'title', 'price')
admin.site.register(Guests, GuestsAdmin)
admin.site.register(Car, CarAdmin)
admin.site.register(Book, BookAdmin)
При этом я не могу привязать ни один объект книг к объекту гостей. В админ панели при добавлении книг и сохранении появляется сообщение такого характера: "Фамилия: Fedorova, Имя: Mariya, Возраст: 34, владеет машиной: Brand: Kia, model: Rio, color: Red, автор книги: hello.Book.None” was changed successfully."
Код добавления вручную тоже не работает:
guest = Guests.objects.get(last_name='Fedorova')
book = Book.objects.get(title='Война и мир')
book.guests_set.add(guest)
По итогу, в графическом интерфейсе отображаются выбранные книги, но при выводе объекта в консоль выводится следующее: "Фамилия: Fedorova, Имя: Mariya, Возраст: 34, владеет машиной: Brand: Kia, model: Rio, color: Red, автор книги: hello.Book.None". Прошу помощи в поиске ошибки. Буду рад любым предположениям и идеям, которые помогут мне понять в чем дело. Спасибо!
А попробуйтe без _set просто .add()
guest.book.add(book)
В модели Guests добавте метод:
def get_book(self):
return ",".join([str(p) for p in self.book.all()])
и в admin.py
list_display = ('get_book')
В админке должно все заработать.
Разобрался с ситуацией. В предложенном решении верно указан способ получения книг при связи ManyToMany. Т.е. если заменить
def __str__(self):
guest_info = (... str(self.book))
return guest_info
на
def __str__(self):
guest_info = (... str(self.get_book()))
return guest_info
то, при обращении к объекту, все книги, связанные с ним отображаются нормально. Таким образом для связи ManyToMany необходимо реализовывать отображение перечня объектов через метод, а не просто в лоб.