在另一个mod的manytomy关系中按分数排序查询集

2024-06-25 06:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下模型设置,每节课属于一个章节,有一个所有者。对于每个章节,用户都有一个存储在UserChapterScore表中的分数

from django.db import models

class User(models.Model):
    name = models.TextField()

class Chapter(models.Model):
    name = models.TextField()

class Lesson(models.Model):
    chapter = models.ForeignKey(Chapter)
    owner = models.ForeignKey(User)
    name = models.TextField()

 class UserChapterScore(models.Model):
     chapter = models.ForeignKey(Chapter)
     user = models.ForeignKey(User)
     score = models.IntegerField(default=0)

我如何检索属于一个章节的课程,由所有者的章节分数排序

编辑:如果需要,请转换为M2M等效值。我用模型来说明模型的结构


Tags: 用户name模型modelmodels分数classchapter
3条回答

对于backward relationships,可以使用<lowercase_related_model_name>_set获取相关模型。例如,您可以尝试以下方法:

Lesson.objects.fitler(chapter=chapter).order_by('chapter__userchapterscore_set__score')

当然可以,你可以试试这个

from django.db import models

class Chapter(models.Model):
    name = models.TextField()

    def get_lessons(self):
        """return all lessions filtered by specific chapter"""
        return Lesson.objects.filter(chapter__pk=self.pk)


class Lesson(models.Model):
    chapter = models.ForeignKey(Chapter)
    owner = models.ForeignKey(User)
    name = models.TextField()

    def get_user_chapters(self):
        """return all chapters by specific `chapter` and `user` in this lession"""
        return UserChapterScore.objects.filter(chapter=self.chapter, user=self.owner)

    def get_user_scores(self):
        """return total scores by specific `chapter` and `user` in this lession"""
        return self.get_user_chapters().aggregate(models.Sum('score'))['score__sum']


class UserChapterScore(models.Model):
    chapter = models.ForeignKey(Chapter)
    user = models.ForeignKey(User)
    score = models.IntegerField(default=0)

更新,你可以每一个它

lessons = [{
    'lessons': chapter.get_lessons(), # return queryset of lessons
    'lessons_detail': [
        {
            'owner': c.owner, 
            'scores': c.get_user_scores(),
            'chapters': c.get_user_chapters()
        } for c in chapter.get_lessons()
    ]
} for chapter in Chapter.objects.all()]

这比我想象的要简单。我需要在LessonUserUserChapterScore之间建立一个连接,这样

  • 这节课的章节就是我要列出的章节
  • 课程所有者id和用户id加入UserLesson
  • UserChapterScore表的章节应该与我想要列表的章节相同
  • UserChapterScore表和User表通过两个表中的用户id连接

当我们在queryset过滤器中使用双下划线符号时,我没有意识到Django会这样做

此外,对于外键,UserChapterScore表的反向访问器在User模型中以userchapterscore的形式存在

最后一个查询是:

Lesson.objects.filter(chapter=chapter, owner__userchapterscore__chapter=chapter).order_by('owner__userchapterscore__score)

相关问题 更多 >