在Django ORM中ManyToMany关系模型之间创建查询
问题描述:
class Review(models.Model):
student = models.ForeignKey(UserDetail)
text = models.TextField()
created_at = models.DateTimeField(auto_now=True)
vote_content = models.FloatField()
vote_knowledge = models.FloatField()
vote_assignment = models.FloatField()
vote_classroom = models.FloatField()
vote_instructor = models.FloatField()
class UserDetail(models.Model):
username = models.CharField(max_length=100)
email = models.CharField(max_length=255)
...
class Course(models.Model):
title = models.CharField(max_length=255)
studentlist = models.ManyToManyField(UserDetail, related_name='course_studentlist', blank=True)
reviewlist = models.ManyToManyField(Review,related_name='course_reviewlist', blank=True)
...
在上述模型结构中,课程模型与UserDetail和ReviewTo ManyToMany具有关系。在Django ORM中ManyToMany关系模型之间创建查询
该审查是根据5票的平均水平。 (内容,知识等)
对课程的评论是选择课程的学生的平均投票数。
我想根据课程的评价进行搜索,例如排序靠前大于3的投票。
感谢您的帮助。
答
最简单,可能是最清晰的解决方案是用于存储Review
平均得分创造更多的领域,并计算出它save()
。
是否有理由将您的课程评论保留为m2m字段?你是否允许在许多课程中使用相同的评论和相同的文字等?在这种情况下,你可能需要ForeignKey
。那么你可以这样做:
class Review(models.Model):
...
vote_avg = models.FloatField()
course = models.ForeignKey('Course')
...
def save(self, *args, **kwargs):
self.voce_avg = (self.vote_content + ...)/5
super(Review, self).save(*args, **kwargs)
def foo():
return Course.objects.prefetch_related('review_set').annotate(
avg_reviews=Avg('review__vote_avg')
).filter(avg_reviews__gt=3).order_by('avg_reviews')
答
试试这个:
from django.db.models import Count
Course.objects.annotate(reviews_count=Count('reviewlist')).filter(reviews_count__gt=3)