Django:基于3步外键连接过滤查询集

时间:2016-09-10 06:28:31

标签: django django-queryset

我有一堆模型,通过用户模型相关:settings.AUTH_USER_MODEL

模型1:

class Submission(models.Model):
    ...
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

模型2:

class Block(models.Model):
    ...
    current_teacher = models.ForeignKey(settings.AUTH_USER_MODEL)

模型3:

class CourseStudent(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    block = models.ForeignKey(Block)
    ...

鉴于两个用户,其中一个是BLock模型中的teacher,另一个是其他两个模型中的student用户,我如何获得提交的查询集,其中: (道歉,我正在努力解决这个问题)

  • CourseStudent.user = Submission.user
  • CourseStudent.block是其中一个具有current_teacher = teacher
  • 的块

换句话说:教师教授特定的积木,学生在这些积木中开设课程。学生提交工作。教师只希望看到学生在(老师)区块中提交的作品。

我想要用户提交的所有提交内容 - > CourseStudent - >块 - > current_teacher,给定老师。

2 个答案:

答案 0 :(得分:1)

我认为你在寻找:

    // There is a long somewhere that needs to be animated. Let's call it valueToAnimate
    // This assumes it's a millisecond value for a time based scrolling view.
    // Make a final copy of it for the animator
    final long startValue = valueToAnimate;
    // Also make a final reference to the target long for the animator
    final long finishValue = valueToAnimate + 1000 * 60 * 60 * 24 * 14; // animate to 2 weeks from now
    // Calculate distance needed to travel
    final long distance = finishValue - startValue;
    // Create a ValueAnimator of floats from 0 through to 1.
    ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            long valueToAnimate = startValue + (long) (distance * (float) animation.getAnimatedValue());
        }
    });
    animator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // Make sure you end on the correct value
            valueToAnimate = finishValue;
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

你从你想要的东西(“Submission.objects.filter(user__coursestudent__block__current_teacher=teacher).distinct() 的查询集”)开始,然后按照你的方式跨越关系。 Submissions的目的是消除重复的结果。 (例如,如果用户在两个不同的块中拥有相同的教师,distinct()将在没有它的情况下出现两次。)

答案 1 :(得分:0)

我认为你需要阻止和提交之间的另一种关系,因为正如你所说,只有学生提交。因此,如果您过滤用户 - > CourseStudent - >块 - > current_teacher然后你会得到'老师'的提交,不是吗?或许我错过了一些东西。