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

Posted

技术标签:

【中文标题】如何访问 Django 中查询集的特定字段?【英文标题】:How can I access a specific field of a queryset in Django? 【发布时间】:2018-02-02 21:13:38 【问题描述】:

我的 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 模型的每个实例的 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>]>

    如何在没有所有其他数据的情况下访问每个对象(5.0 和 3.0)的两个评级值?

    这可以通过我能够平均数字并返回最终值的方式完成吗?

【问题讨论】:

你有很多书,每本书都有很多用户评分。正确的?如果是这样,为什么不使用 ManyToMany 字段?然后你可以得到一本书的所有评分并平均费率等 【参考方案1】:

对于 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,值是评分的平均值。

【讨论】:

【参考方案2】:

多对一字段请参阅以下内容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

祝你好运!

【讨论】:

以上是关于如何访问 Django 中查询集的特定字段?的主要内容,如果未能解决你的问题,请参考以下文章

使用列名的辅助列表访问 Django 查询集的值

Django更改查询集字段不影响数据库

Django 计算特定用户在日期时间字段中某个日期的访问次数

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

Django如何过滤多对多字段中的对象,而不是原始查询集

如何从Swift中的Cloud FireStore Firebase访问特定字段