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 будет выглядеть в будущем, что является хорошей отправной точкой для отладки ваших запросов.