Запрос отношений "многие-ко-многим" в django
У меня есть отношения типа "многие-ко-многим" в django, как сделать так, чтобы я мог выполнить запрос "получить все книги, написанные автором Маттиа"
class Autore(models.Model):
nome = models.CharField(max_length=100)
def __str__(self):
return self.nome
class Libro(models.Model):
titolo = models.CharField(max_length=100)
autori = models.ManyToManyField(Autore, related_name="libri")
def __str__(self):
return self.titolo
В файле views.py я пытаюсь сделать это, но не могу получить нужный объект.
@api_view(["GET"])
def libri_autore(request, nome_autore):
# Recupera l'autore dal database (si presuppone che il nome sia unico)
autore = Autore.objects.get(nome=nome_autore)
serializer = LibroAutoreSerializer(autore)
print(autore)
# Recupera tutti i libri associati a quell'autore
libri = autore.libri.all()
print(libri.values())
return HttpResponse("Libri recuperati con successo")
Для этого сайта было бы лучше называть ваши модели на английском языке, это помогло бы большему количеству людей понять, что вы имеете в виду, более четко. Итак, похоже, что у вас есть автор и связанные с ним книги. Если предполагается, что у одной книги один автор, то вы должны использовать ForeignKey в вашей модели:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name="books")
def __str__(self):
return self.title
тогда вы можете получить все книги автора через:
Book.objects.filter(author = author.id) # assume your got author instance
# of Author
#or Author.books.all() #если определено связанное имя или:
Author.book_set.all() #default Django _set retrieval
Если вы хотите получать не только id, но и экземпляр Book: в ваших сериализаторах создайте сериализатор для Book(BookSerialyzer), затем в AuthorSerialyzer(да, не BookAuthor, потому что вы сериализуете модели, а не отношения) определите, что книга должна быть не просто id, а экземпляром модели, сделайте это, добавив:
books = BookSerialyzer() #books is the name of the field, where you want
# to get instances, not only IDs
На самом деле я думаю, что проблема в логике ваших моделей, сериализаторов. Как я понял, вы хотите получить экземпляр автора с полем 'books', то есть массив экземпляров Book.
Вы можете написать это в файле views.py;
autore = Autore.objects.prefetch_related('libri').filter(nome=nome_autore).first()
libri = Libro.objects.filter(autori__id=autore.id)
Теперь у вас есть список книг от автора в libri variable-queryset-