【问题标题】:Django Signals: The QuerySet value for an exact lookup must be limited to one result using slicingDjango 信号:精确查找的 QuerySet 值必须使用切片限制为一个结果
【发布时间】:2019-11-05 05:14:23
【问题描述】:

我希望我的标题足以确定错误是什么。

我的models.py (post_save) 中有这段代码

    class StudentsEnrolledSubject(models.Model):
        Students_Enrollment_Records = models.ForeignKey(StudentsEnrollmentRecord, related_name='+',
                                                        on_delete=models.CASCADE, null=True)
        Subject_Section_Teacher = models.ForeignKey(SubjectSectionTeacher, related_name='+', on_delete=models.CASCADE,
                                                    null=True,blank=True)

    @receiver(post_save, sender=StudentsEnrollmentRecord)
    def create(sender, instance, created, *args, **kwargs):
        teachers = SubjectSectionTeacher.objects.filter(Sections=instance.Section,Education_Levels=instance.Education_Levels,Courses=instance.Courses)
        for each in teachers:
            if created and teachers.exists():
                StudentsEnrolledSubject.objects.update_or_create(
                        pk=each.id,
                        Students_Enrollment_Records=instance,
                        Subject_Section_Teacher=teachers.all()

                    )

    class StudentsEnrollmentRecord(models.Model):
        Student_Users = models.ForeignKey(StudentProfile, related_name='students', on_delete=models.CASCADE, null=True)

    class SubjectSectionTeacher(models.Model):
        Education_Levels = models.ForeignKey(EducationLevel, related_name='+', on_delete=models.CASCADE, blank=True)
        Courses = models.ForeignKey(Course, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
        Sections = models.ForeignKey(Section, related_name='+', on_delete=models.CASCADE, null=True)
        Subjects = models.ForeignKey(Subject, related_name='+', on_delete=models.CASCADE, null=True)
        Employee_Users = models.ForeignKey(EmployeeUser, related_name='+', on_delete=models.CASCADE, null=True)

当我使用Subject_Section_Teacher=teachers.first() 时,我没有收到任何错误,但这不是我想要的结果,然后我决定将其更改为Subject_Section_Teacher=teachers.all()

我只希望结果变成这样

不是这个

这是我获取/过滤数据的地方

【问题讨论】:

    标签: django


    【解决方案1】:

    由于您已经在迭代 teachers,因此您应该使用 each 在循环中传递当前的 teacher 而不是 teachers.all() 无效或 teachers.first() 始终只是第一个老师:

        for each in teachers:
            if created and teachers.exists():
                StudentsEnrolledSubject.objects.update_or_create(
                        pk=each.id,
                        Students_Enrollment_Records=instance,
                        Subject_Section_Teacher=each,
                    )
    

    【讨论】:

    • 好先生 :)
    【解决方案2】:

    像这样更新代码:

    @receiver(post_save, sender=StudentsEnrollmentRecord)
    def create(sender, instance, created, *args, **kwargs):
        teachers = SubjectSectionTeacher.objects.filter(Sections=instance.Section,Education_Levels=instance.Education_Levels,Courses=instance.Courses)
        for each in teachers:
            StudentsEnrolledSubject.objects.update_or_create(
                        pk=each.id,
                        Students_Enrollment_Records=instance,
                        Subject_Section_Teacher=each
    
                    )
    

    【讨论】:

    • 又好一个先生 :)
    猜你喜欢
    • 2019-10-02
    • 2019-05-26
    • 2021-04-23
    • 2020-11-13
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多