我在 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")
最好在这个网站上用英文命名你的模型,这将帮助更多的人更明确地理解你的意思。所以看来你有作者和相关书籍。如果假设一本书有一位作者,您应该在模型中使用外键:
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
实际上我认为你的模型、序列化器的逻辑存在问题。据我了解,您想要获取具有“书籍”字段的作者实例,这是一个书籍实例数组。