django.core.exceptions.FieldError:无法将关键字“department_name”解析为字段

问题描述 投票:0回答:2

如何正确使用serializers.SlugRelatedField?
我的代码看起来像这样,但出现错误...
有完整的错误:
django.core.exceptions.FieldError:无法将关键字“department_name”解析为字段。选项包括:徽章、created_at、department、department_id、gender、id、name、position、position_id、updated_at

型号代码:

class Employee(models.Model):
    GENDER_CHOICES = (
        ('Male', 'Male'),
        ('Female', 'Female'),
    )
    name = models.CharField(max_length=100)
    badge = models.CharField(max_length=6, unique=True)
    gender = models.CharField(max_length=20, choices=GENDER_CHOICES)
    department = models.ForeignKey(
        Department, on_delete=models.CASCADE, null=True)
    position = models.ForeignKey(
        Position, on_delete=models.CASCADE, null=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.name} - {self.badge}'

序列化器代码

from rest_framework import serializers
from .models import Employee


class EmployeeSerializer(serializers.ModelSerializer):
    department = serializers.SlugRelatedField(
        slug_field='department_name', queryset=Employee.objects.all())
    # position = serializers.SlugRelatedField(
    #     slug_field='position_name', queryset=Employee.objects.all()

    class Meta:
        model = Employee
        fields = '__all__'

django django-models django-rest-framework django-views django-serializer
2个回答
0
投票

在您的序列化器代码中,执行以下操作

slug_field='department', queryset=Employee.objects.all())

这是因为你的“Employee”模型类中没有任何名为“department_name”的字段。


0
投票

您确定 SlugFiled 是最佳选择吗?

要获取部门名称,您可以使用:

department = serializers.CharField(source="department.department_name")

但是你的部门 FK 可以为空,这会更好:

class EmployeeSerializer(serializers.ModelSerializer):
    department = serializers.SerializerMethodField()

    class Meta:
        model = Employee
        fields = '__all__'

    @staticmethod
    def get_department(obj):
        return obj.department.department_name if obj.department else None
© www.soinside.com 2019 - 2024. All rights reserved.