如何基于ProductsRating的is_it_good字段排序Products查询集?
问题解决:基于ProductsRating的is_it_good字段排序Products查询集
核心问题:你的Products和ProductsRating模型之间未建立关联,导致Django ORM无法识别
productsrating反向关联字段;同时ProductsRating的is_it_good字段验证器参数写反,会导致所有数值都不合法。第一步:修复模型关联与验证器
修改models.py中的ProductsRating模型,添加与Products的外键关联,并修正验证器顺序:
from django.core.validators import MaxValueValidator, MinValueValidator class ProductsRating(models.Model): is_it_good = models.IntegerField(validators=[MaxValueValidator(5), MinValueValidator(0)]) # 修正验证器,允许0-5的数值 whose_rated = models.ForeignKey(CusUser, on_delete=models.CASCADE) product = models.ForeignKey(Products, on_delete=models.CASCADE, related_name='productsrating') # 建立与Products的关联,指定related_name
- 第二步:执行数据库迁移
在终端运行命令使模型修改生效:
python manage.py makemigrations python manage.py migrate
- 第三步:编写正确的排序查询代码
通过指定的related_name关联查询集,按最大评分排序:
qs = Products.objects.annotate( biggest_rating=Max('productsrating__is_it_good') ).order_by('biggest_rating') # 若需倒序(最高分在前),使用负号:order_by('-biggest_rating')
如果不想设置related_name,也可以使用Django默认的反向关联名称productsrating_set:
qs = Products.objects.annotate( biggest_rating=Max('productsrating_set__is_it_good') ).order_by('biggest_rating')
内容的提问来源于stack exchange,提问作者fasfrtewqt2354r2edrq
相关产品推荐
相关产品推荐

