Поле внешнего ключа не отображается в сериализаторах django
Я пытаюсь отобразить имя поля внешнего ключа вместо id объекта, но не могу справиться с этой задачей. Пробовал использовать related_name и затем привязать его к сериализатору, но все равно безуспешно,
models.py
class Employee(base_models.BaseDateModel):
"""
DB model to store employee data
"""
name = models.CharField(max_length=50)
level = models.SmallIntegerField(choices=LEVEL_CHOICES, default=L1)
def __str__(self):
return f'{self.name} - {self.get_level_display()}'
class Room(base_models.BaseDateModel):
"""
DB model to store available rooms in the building
"""
name = models.CharField(max_length=15)
def __str__(self):
return f'{self.name}'
class Seat(base_models.BaseDateModel):
"""
DB model to store available seats in a given room
"""
room = models.ForeignKey('seating.Room', on_delete=models.CASCADE)
def __str__(self):
return f'{self.room} - {self.id}'
class EmployeeSeating(base_models.BaseDateModel):
"""
DB model to store the seating details of any employee
"""
name = models.ForeignKey('seating.Employee', on_delete=CASCADE, related_name='emp_name')
room = models.ForeignKey('seating.ROOM', on_delete=CASCADE, related_name='emp_room')
seat = models.ForeignKey('seating.SEAT', on_delete=CASCADE, related_name='emp_seat')
def __str__(self):
return f'{self.name} - {self.room} - {self.seat}'
serializers.py
class EmployeeSeatingSerializer(serializers.ModelSerializer):
emp_name = serializers.StringRelatedField()
emp_room = serializers.StringRelatedField()
emp_seat = serializers.StringRelatedField()
class Meta:
model = EmployeeSeating
fields = ('id', 'emp_name', 'emp_room', 'emp_seat')
views.py
def listemp_api(request, pk=None):
"""
Method to return the list of employee in a given room
"""
if request.method == 'GET':
room_id = pk
if room_id:
employee_data = EmployeeSeating.objects.filter(room_id = room_id)
serializer = EmployeeSeatingSerializer(employee_data, many=True)
return Response(serializer.data)
else:
employee_data = EmployeeSeating.objects.all()
print(employee_data)
serializer = EmployeeSeatingSerializer(employee_data, many=True)
return Response(serializer.data)
Результат набора запросов с использованием моего представления выглядит следующим образом
[
{
"id": 1
},
{
"id": 2
},
{
"id": 5
}
]
но мне нужны комната, место и другие сериализованные поля, которые я добавил с помощью stringfield, но не смог этого добиться.
Использование fields = '__all__'
дает мне номер объекта, но пропускает дополнительные поля, которые я хочу, т.е. emp_room, emp_name и т.д.
Прежде чем двигаться дальше, я хочу объяснить, что поле related_name
используется, если вы хотите получить доступ к EmployeeSeating
модели из Employee
модели. Но, EmployeeSeatingSerializer
делает обратное.
Во-вторых, во внешних ключах модели EmployeeSeating
, я думаю, вам стоит подумать о переименовании seating.ROOM
в seating.Room
(если это не работает) и то же самое для seating.SEAT
. Убедитесь из админ-панели django, что внешние ключи связаны правильно, иначе ничего не будет работать.
Обязательно выполните makemigrations
и migrate
после внесения изменений в базу данных.
Сначала просто попробуйте это на поле name
сериализатора. Удалите другие поля.
- Создайте сериализатор модели для модели
Employee
, скажемEmployeeSerializer
. Укажите только поле, которое вы хотите показать, в данном случае это полеname
. - В своем
EmployeeSeatingSerializer
измените полеemp_name
на поле, которое используется для ссылки на модельEmployee
, в данном случае этоname
. То же самое сделайте и для других полей. - Измените
emp_name = serializers.StringRelatedField()
наname = EmployeeSerializer()
. Сделайте то же самое для других полей.
Попробуйте.
Попробуйте это:
class Employee(base_models.BaseDateModel):
"""
DB model to store employee data
"""
name = models.CharField(max_length=50)
level = models.SmallIntegerField(choices=LEVEL_CHOICES, default=L1)
def __str__(self):
return f'{self.name} - {self.get_level_display()}'
class Room(base_models.BaseDateModel):
"""
DB model to store available rooms in the building
"""
name = models.CharField(max_length=15)
def __str__(self):
return f'{self.name}'
class Seat(base_models.BaseDateModel):
"""
DB model to store available seats in a given room
"""
room = models.ForeignKey(Room, on_delete=models.CASCADE)
def __str__(self):
return f'{self.room} - {self.id}'
class EmployeeSeating(base_models.BaseDateModel):
"""
DB model to store the seating details of any employee
"""
name = models.ForeignKey(Employee, on_delete=CASCADE, related_name='emp_name')
room = models.ForeignKey(Room, on_delete=CASCADE, related_name='emp_room')
seat = models.ForeignKey(Seat, on_delete=CASCADE, related_name='emp_seat')
def __str__(self):
return f'{self.name} - {self.room} - {self.seat}'