Я хочу группировать сущности на основе одного отношения внешнего ключа в rest django

У меня есть две модели, и записи связаны с сотрудником

class Employee(models.Model):
     name = models.CharField(max_length=100)
     position = models.CharField(max_length=100)
     site = models.CharField(max_length=100)
     wage = models.DecimalField(max_digits=4, decimal_places=0, default=0)

class Record(models.Model):
     employee = models.ForeignKey(Employee, related_name='employee', 
     on_delete=models.DO_NOTHING)
     date = models.DateField()
     cash = models.DecimalField(max_digits=4, decimal_places=0, default=0)

Я хотел бы сгенерировать список всех записей о каждом сотруднике. Что-то вроде следующего

{
  "id": 1,
  "name": "John Doe",
  "position": "manager",
  "Records": [
    {
      "date": "2020-12-09T18:30:00.000Z",
      "cash": 888
    },
    {
      "date": "2020-10-10T18:30:00.000Z",
      "cash": 999
    }
  ]
}

Пожалуйста, помогите мне написать сериализатор и набор представлений для моего вышеуказанного требования.

Не имеет смысла related_name='employee': параметр related_name=… [Django-doc] является именем отношения в reverse, поэтому, например, records:

class Record(models.Model):
    employee = models.ForeignKey(
        Employee, related_name='records', on_delete=models.DO_NOTHING
    )
    date = models.DateField()
    cash = models.DecimalField(max_digits=4, decimal_places=0, default=0)

Тогда мы можем работать с субсериализатором:

from rest_framework import serializers


class RecordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Record
        fields = ['date', 'cash']


class EmployeeSerializer(serializers.ModelSerializer):
    records = RecordSerializer(many=True)

    class Meta:
        model = Employee
        fields = ['id', 'name', 'position', 'records']

В сериализаторе мы можем предварительно получить записи:

from rest_framework import viewsets


class EmployeeViewSet(viewsets.ModelViewSet):
    serializer_class = EmployeeSerializer
    queryset = Employee.objects.prefetch_related('records')
Вернуться на верх