Получение данных сериализатора по внешнему ключу
Мне нужно передать данные из 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')