如何在Django中访问查询集的特定字段?

时间:2017-08-24 21:08:52

标签: python django database django-views django-queryset

我的Django应用程序中有这些模型:

class Book(models.Model):
    title = models.CharField(max_length=50, unique=True)
    owner = models.CharField(max_length=30)
    price = models.DecimalField(max_digits=5, decimal_places=2, null=True)
    book_rating = models.ForeignKey('Rating', null=True)

RATE_CHOICES = zip(range(1,6), range(1,6))
class Rating(models.Model):
    user = models.ForeignKey(User)
    this_book = models.ForeignKey(Book)
    rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES)
    comment = models.TextField(max_length=4000, null=True)

我正在尝试访问Book模型的每个实例的评级。这是我到目前为止在shell中尝试的内容:

from django.contrib.contenttypes.models import ContentType
>>> ctype = ContentType.objects.get_for_model(Rating)
>>> ctype
<ContentType: rating>
>>> book_titles = ctype.model_class().objects.filter(this_book__title='My Test Book')
>>> book_titles
<QuerySet [<Rating: My Test Book - parrot987 - 3.0>, <Rating: My Test Book - 123@gmail.com - 5.0>]>
  1. 如何在没有所有其他数据的情况下访问每个对象(5.0和3.0)的两个评级值?

  2. 可以这样做,我能够平均数字并返回最终值吗?

2 个答案:

答案 0 :(得分:4)

对于1.您可以使用(relevant documentation):

Rating.objects.filter(this_book__title='My Test Book').values('rate')

如果您只想要一个平面列表,可以使用values_list('rate', flat=True)代替values('rate')

2(relevant documentation):

from django.db.models import Avg

Rating.objects.filter(this_book__title='My Test Book').aggregate(Avg('rate'))

这将返回一个字典,其中键为rate__avg,值为评级的平均值。

答案 1 :(得分:0)

请参阅以下多对一字段django - Get the set of objects from Many To One relationship

要访问评级,您可以使用for循环并访问各个值,例如

total = 0
for rating in book_titles.book_set.all()
    total += rating.rate
祝你好运!