2017-02-15 211 views
0
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的投票。

感謝您的幫助。

回答

0

最簡單,可能是最清晰的解決方案是用於存儲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') 
0

試試這個:

from django.db.models import Count 

Course.objects.annotate(reviews_count=Count('reviewlist')).filter(reviews_count__gt=3) 
相關問題