Mat*_*you 2 python database django django-queryset django-views
我的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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试访问Book模型的每个实例的Ratings。到目前为止,这是我在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>]>
Run Code Online (Sandbox Code Playgroud)
如何在没有其他所有数据的情况下访问每个对象的两个额定值(5.0和3.0)?
能否以我能够平均数字并返回最终值的方式来完成此操作?
对于1.,您可以使用(相关文档):
Rating.objects.filter(this_book__title='My Test Book').values('rate')
Run Code Online (Sandbox Code Playgroud)
如果您只想要一个平面列表,可以使用values_list('rate', flat=True)代替values('rate')。
对于2(相关文档):
from django.db.models import Avg
Rating.objects.filter(this_book__title='My Test Book').aggregate(Avg('rate'))
Run Code Online (Sandbox Code Playgroud)
这将返回一个字典,其中的键是键rate__avg,其值是评分的平均值。