Как я могу сортировать экземпляры по полю, связанному с fk, в сериализаторе в Django?
Согласно предыдущему ответу на один из моих вопросов я пытаюсь перегруппировать набор qs_payments объектов по полям month, используя их отношения fk.
В моем предыдущем запросе было сказано you can just serialize the Payments on each Month directly
Но как я могу добиться этого? Насколько я понимаю, я должен использовать сериализатор для модели месяцев и сказать ему, чтобы он сортировал qs по месяцам?
# models.py
class Period(models.Model):
period = models.DateField()
class Payment(models.Model):
offer = models.ForeignKey(Offer, on_delete=models.CASCADE)
month = models.ForeignKey(Period, on_delete=models.CASCADE)
amount = models.PositiveIntegerField()
# serializers.py
class PaymentSerializer(serializers.ModelSerializer):
class Meta:
model = Payment
fields = '__all__'
class PeriodSerializer(serializers.ModelSerializer):
class Meta:
model = Period
fields = '__all__'
class PayrollRun(APIView):
def get(self, request):
# Get the related company according to the logged in user
company = Company.objects.get(userprofile__user=request.user)
# Get a queryset of payments that relate to the company and are not older than XX days
qs_payments = Payment.objects.filter(offer__company=company)
print(qs_payments)
serializer = PaymentSerializer(qs_payments, many=True)
return Response(serializer.data)
Желаемый результат заключается в том, что я хочу сопоставить каждый месяц с компонентом React, содержащим все элементы строк этого конкретного месяца. Поэтому мне нужен (по крайней мере, имхо) словарь месяцев, каждый из которых имеет список dicts, содержащий элементы строк (предложение, сумма, id) и, если возможно, количество элементов и сумму всех сумм
Текущий вывод не сгруппирован по месяцам:
[
{
"id": 1,
"amount": 3535,
"offer": 49,
"month": 6
},
{
"id": 2,
"amount": 3535,
"offer": 50,
"month": 6
},
{
"id": 49,
"amount": 3535,
"offer": 52,
"month": 6
},
{
"id": 50,
"amount": 3535,
"offer": 52,
"month": 7
},
{
"id": 51,
"amount": 3535,
"offer": 52,
"month": 8
},