【问题标题】:Create query between ManyToMany relationship models in Django ORM在 Django ORM 中创建多对多关系模型之间的查询
【发布时间】:2017-02-15 13:31:53
【问题描述】:
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)
    ...

在上述模型结构中,Course模型与UserDetail有关系,Review与ManyToMany有关系。

评论基于 5 票的平均值。 (内容、知识等)

对课程的评价是参加该课程的学生的平均票数。

我想根据课程的评论进行搜索和排序,例如超过 3 票的列表。

感谢您的帮助。

【问题讨论】:

    标签: django django-models many-to-many


    【解决方案1】:

    最简单也可能是最简洁的解决方案是在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')
    

    【讨论】:

      【解决方案2】:

      试试这个:

      from django.db.models import Count
      
      Course.objects.annotate(reviews_count=Count('reviewlist')).filter(reviews_count__gt=3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 2019-04-22
        • 2010-12-11
        • 2020-01-02
        • 2012-09-18
        • 2020-09-28
        • 2021-03-07
        相关资源
        最近更新 更多