Получение данных сериализатора по внешнему ключу

Мне нужно передать данные из EmployeeSerializer в VacationSerializer в виде вложенного json. Вот мой serializer.py:

class EmployeeSerializer(serializers.ModelSerializer):
    

    class Meta:
        model = Employee
        fields = ('pk', 'first_name', 'surname', 'patronymic', 'birthday', 'email', 'position', 'phone_number')

class VacationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vacation
        fields = ('pk', 'start_date', 'end_date', 'employee_id', 'employee')

и мой models.py:

class Employee(models.Model):
    first_name = models.CharField("Name", max_length=50)
    surname = models.CharField("surname", max_length=50)
    patronymic = models.CharField("patronymic", max_length=50)
    birthday = models.DateField()
    email = models.EmailField()
    position = models.CharField("position", max_length=128)
    phone_number = models.CharField("phone", max_length=12, null=True)
    is_deleted = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.surname} {self.first_name} {self.patronymic}'

class Vacation(models.Model):
    start_date = models.DateField()
    end_date = models.DateField()
    employee_id = models.ForeignKey(Employee, related_name='employee', on_delete=models.PROTECT, default=-1)

    def __str__(self):
        return f'{self.start_date} - {self.end_date}'

    @property
    def date_diff(self):
        return (self.end_date - self.start_date).days

В файле views.py у меня есть следующее:

@api_view(['GET', 'POST'])
def vacations_list(request):
    
    if request.method == 'GET':
        data = Vacation.objects.all()
        serializer = VacationSerializer(data, context={'request': request}, many=True)

        return Response(serializer.data)

Я пробовал следующее:

class VacationSerializer(serializers.ModelSerializer):
    employee = EmployeeSerializer(read_only=True, many=True)
    class Meta:
        model = Vacation
        fields = ('pk', 'start_date', 'end_date', 'employee_id', 'employee')

но он не показывает мне даже пустой вложенный json, он показывает мне только VacationSerializer data.

Я легко могу получить доступ к VacationSerializer из EmployeeSerializer с помощью PrimaryKeySerializer или любого другого сериализатора и получить вложенный json, где VacationSerializer данные вложены в EmployeeSerializer данные. Но я хочу получить обратное - вложенный json сотрудника, связанного с этим отпуском. Как этого добиться?

Это связано с именованием в вашей модели. Вам необходимо сериализовать поле 'employee_id':

class VacationSerializer(serializers.ModelSerializer):
    employee_id = EmployeeSerializer()

    class Meta:
        model = Vacation
        fields = ('pk', 'start_date', 'end_date', 'employee_id')
Вернуться на верх