在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)