Запрос отношений "многие-ко-многим" в 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-

Вернуться на верх