Поле внешнего ключа не отображается в сериализаторах 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 сериализатора. Удалите другие поля.

  1. Создайте сериализатор модели для модели Employee, скажем EmployeeSerializer. Укажите только поле, которое вы хотите показать, в данном случае это поле name.
  2. В своем EmployeeSeatingSerializer измените поле emp_name на поле, которое используется для ссылки на модель Employee, в данном случае это name. То же самое сделайте и для других полей.
  3. Измените 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}'
Вернуться на верх