我試圖顯示外鍵欄位名稱而不是物件 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
}
]
但我想要房間、座位和其他使用字串欄位添加但無法實作的序列化欄位。使用fields = '__all__'給了我物件編號,但錯過了我想要的附加欄位,即。emp_room、emp_name 等
uj5u.com熱心網友回復:
在繼續之前,我想解釋一下,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()。對其他欄位執行相同操作。
試試這個。
uj5u.com熱心網友回復:
試試這個:
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}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/396503.html
