django 中的多对多关系查询

问题描述 投票:0回答:1

我在 django 中有这样的多对多关系,我该如何制作它以便我可以执行查询“获取作者 Mattia 写的所有书籍”

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")
python django django-models
1个回答
0
投票

最好在这个网站上用英文命名你的模型,这将帮助更多的人更明确地理解你的意思。所以看来你有作者和相关书籍。如果假设一本书有一位作者,您应该在模型中使用外键:

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

#或 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 

实际上我认为你的模型、序列化器的逻辑存在问题。据我了解,您想要获取具有“书籍”字段的作者实例,这是一个书籍实例数组。

© www.soinside.com 2019 - 2024. All rights reserved.