【问题标题】:Foreign key field not rendering in serializers django外键字段未在序列化程序 django 中呈现
【发布时间】:2021-12-28 06:29:49
【问题描述】:

我试图显示外键字段名称而不是对象 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 等

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    在继续之前,我想解释一下,如果你想从Employee 模型访问EmployeeSeating 模型,则使用related_name 字段。但是,EmployeeSeatingSerializer 正在做相反的事情。 其次,在EmployeeSeating 模型外键中,我认为您应该考虑将seating.ROOM 重命名为seating.Room(如果它不起作用),对于seating.SEAT 也是如此。如果外键链接正确,请从 django 管理面板确保,否则将无法正常工作。

    确保在对数据库进行更改后执行makemigrationsmigrate

    首先,在序列化器的name 字段上试试这个。删除其他字段。

    1. Employee 模型创建一个模型序列化程序,例如EmployeeSerializer。仅提供您要显示的字段,在本例中为 name 字段。
    2. 在您的EmployeeSeatingSerializer 中,将emp_name 字段更改为用于引用Employee 模型的字段,在本例中为name。对其他字段也这样做。
    3. emp_name = serializers.StringRelatedField() 更改为name = EmployeeSerializer()。对其他字段执行相同操作。

    试试这个。

    【讨论】:

      【解决方案2】:

      试试这个:

      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}'
      

      【讨论】:

      • 谢谢,但这并没有帮助,看来您更改了相关型号名称。 Django 确实在 model name = models.ForeignKey('seating.Employee', on_delete=CASCADE,related_name='emp_name') 中支持这样的东西
      猜你喜欢
      • 2021-02-13
      • 2016-04-10
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多