簡體   English   中英

序列化程序 django 中未呈現外鍵字段

[英]Foreign key field not rendering in serializers django

我試圖顯示外鍵字段名稱而不是 object id 但無法通過它。 嘗試使用related_name,然后將其綁定到序列化程序但仍然沒有運氣,

模型.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}'

序列化程序.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')

視圖.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__'給了我 object 編號,但錯過了我想要的其他字段,即。 emp_room、emp_name 等

在繼續之前,我想解釋一下,如果您想從Employee model 訪問EmployeeSeating related_name ,則使用 related_name 字段。 但是, EmployeeSeatingSerializer正在做相反的事情。 其次,在EmployeeSeating model 外鍵中,我認為您應該考慮將seating.ROOM重命名為seating.Room (如果它不起作用),對於seating.SEAT 如果外鍵鏈接正確,請確保從 django 管理面板,否則將無法正常工作。

確保在對數據庫進行更改后進行makemigrationsmigrate

首先,只需在序列化程序的name字段上嘗試此操作。 刪除其他字段。

  1. Employee model 創建一個 model 序列化程序,比如EmployeeSerializer 僅提供您要顯示的字段,在本例中為name字段。
  2. 在您的EmployeeSeatingSerializer中,將emp_name字段更改為用於引用Employee model 的字段,在本例中為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}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM