Я хочу группировать сущности на основе одного отношения внешнего ключа в 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')