Django 模型:一对多关系,跨表扩展 -- 如何获取带有评论的所有书籍对象?



我的问题:

我有一些 django 模型,它们设置了各种一对多关系。我正在尝试检索所有有评论的书籍(我不想检索任何没有评论的书籍)。虽然我试图做的事情看起来相对简单,但我在实现我的目标方面遇到了真正的困难。似乎我可能无法正确理解如何跨表,以及任何人都可以提供的任何建议来帮助我更好地了解如何获取所有存储ReviewBook对象。

我的模型:

class User(models.Model):
"""Creates instances of a `User`."""
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
password = models.CharField(max_length=22)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = UserManager() # Attaches custom `UserManager` methods to our `User.objects` object.
class Author(models.Model):
"""Creates instances of a `Author`."""
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Book(models.Model):
"""Creates instances of a `Book`."""
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE) # ties us into an author for the book. if author deleted, books delete too.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Review(models.Model):
"""Creates instances of a `Review`."""
description = models.CharField(max_length=500) 
user = models.ForeignKey(User, on_delete=models.CASCADE) # ties to user, if user deleted, deletes all user reviews
book = models.ForeignKey(Book, related_name="reviews") # book for review
rating = models.IntegerField() # user rating between 1-5
created_at = models.DateTimeField(auto_now_add=True) 
updated_at = models.DateTimeField(auto_now=True) 
objects = ReviewManager() # Attaches 'ReviewManager' to `Review.objects` methods.

我尝试过:

我尝试对我的Review.book财产进行related_name="reviews",并且尝试通过Book.objects.all().reviews_set.all()或类似的此类查询访问评论,使用_set.all()并且可能遗漏了某些内容/做得不正确。

期望目标:

检索所有附加了ReviewBook对象(不检索没有审阅Book对象)。

谁能帮我指出正确的方向或告诉我我做错了什么?感谢您抽出宝贵时间阅读!

这是我收集所有书籍的最佳解决方案,这些书籍至少有一篇评论。这似乎满足了我的需求并回答了我最初的问题:

Book.objects.filter(review__gte=1).distinct()

这就是说,从Book模型中,获取任何评论gte(大于或等于)1的书籍 - 并确保它们是distinct()的,即没有重复。

最新更新