[英]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 管理面板,否則將無法正常工作。
確保在對數據庫進行更改后進行makemigrations
和migrate
。
首先,只需在序列化程序的name
字段上嘗試此操作。 刪除其他字段。
Employee
model 創建一個 model 序列化程序,比如EmployeeSerializer
。 僅提供您要顯示的字段,在本例中為name
字段。EmployeeSeatingSerializer
中,將emp_name
字段更改為用於引用Employee
model 的字段,在本例中為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}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.