Django Order_by извлекает одни и те же данные трижды

У меня есть модель под названием Annual. Когда я извлекаю годовой отчет из базы данных после использования order_by в наборе запросов, одни и те же данные извлекаются трижды.

Вот мой views.py

class AnnualView(APIView):
    serializer_class = AnnualSerializer

    def get(self, request):
        queryset = Annual.objects.all().order_by('-group__student__level', '-group__gName')
        print(queryset)
        serializer = self.serializer_class(queryset, many=True)
        for serialized_data in serializer.data:
            current = serialized_data.get('current')
            for data in current:
                data.get('topic')['current']= data.get('current')
                data.get('category')['topic']= data.get('topic')
            
                data.pop('topic')
                data.pop('current')
        
        context = {
            "Status": 200,
            "payload": serializer.data
        }

        return Response(context)

Вот мой Model.py

class Group(models.Model):
    id = models.AutoField(primary_key = True)
    student = models.ManyToManyField(Students, related_name="student_groups", default="No Student")
    gName = models.CharField(max_length=10)
    teacher = models.ForeignKey(User, related_name="GroupTeacher", on_delete=DO_NOTHING)
    speciality = models.ForeignKey(SubjectSpeciality, on_delete=models.DO_NOTHING, blank=True)
    subject = models.ForeignKey(Subject, on_delete=models.DO_NOTHING, blank=True)

class AnnualCurrentPL(models.Model):
    id = models.AutoField(primary_key = True)
    category = models.ForeignKey(Category, on_delete=DO_NOTHING)
    topic = models.ForeignKey(Topic, on_delete=DO_NOTHING)
    current = models.CharField(max_length=512)
    annual = models.ForeignKey("Annual", on_delete=DO_NOTHING, blank=True, null=True)

# Annual Report Model
class Annual(models.Model):
    id = models.AutoField(primary_key=True)
    teacher = models.CharField(max_length=100)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    year = models.CharField(max_length=100, default="2022")
    # current = models.CharField(max_length=512, default="current")
    current = models.ManyToManyField(AnnualCurrentPL, related_name="AnnualCurrentPL", blank=True)
    expectations = models.CharField(max_length=512, blank=True)
    month = models.ManyToManyField("MonthAnnual", blank=True)

class MonthAnnual(models.Model):
    id = models.AutoField(primary_key=True)
    numeric_Month = models.IntegerField()
    month = models.CharField(max_length=100)
    year = models.IntegerField()
    teacher = models.CharField(max_length=255)
    goal = models.CharField(max_length=512)

Я включил все модели, ответственные за конечный результат.

Когда я отключаю order_by из queryset в views.py, данные получаются нормально. Я потратил несколько часов, чтобы разобраться в этом. Единственное решение, которое я нашел, это не включать order_by в функции.

Как насчет добавления .distinct()? Решит ли это проблему?

Ваш order_by вызывает неявное объединение многих таблиц, включая по крайней мере одно отношение M2M. Ваше упорядочивание приведет, как минимум, к записи для каждого студента/группы/годового отношения. Если вы сделаете print(queryset.values("id", "group__student__level", "group__gName")), вы сможете наблюдать, что именно происходит. Вы должны либо использовать .distinct(), чтобы взять только первый год для каждой записи, либо что-то вроде .aggregate(). В официальной документации есть хорошие примеры того и другого.

И вы всегда можете использовать queryset.query, чтобы увидеть, как SQL будет выглядеть в будущем, что является хорошей отправной точкой для отладки ваших запросов.

Вернуться на верх