DRF 自定义序列化程序“字段名称对模型无效”

时间:2021-05-10 18:49:53

标签: django django-rest-framework

我有一个大模型,我想将其简化为名称及其 ID。我的(相关)代码如下:

### Models
class Person(models.Model):
    first_name = models.CharField(max_length=80)
    last_name = models.CharField(max_length=80)

class Employee(models.Model):
    person = models.OneToOneField('Person', related_name='employee', on_delete=models.CASCADE)

class Job(models.Model):
    employee = models.ForeignKey('Employee')

### Serializers
class SimpleEmployeeSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        name = instance.person.first_name + ' ' + instance.person.last_name
        return {
            'id': instance.id,
            'name': name,
        }

    def to_internal_value(self, data):
        try:
            try:
                obj_id = data['id']
                return Employee.objects.get(id=obj_id)
            except KeyError:
                raise serializers.ValidationError(
                    'id is a required field.'
                )
            except ValueError:
                raise serializers.ValidationError(
                    'id must be an integer.'
                )
        except Employee.DoesNotExist:
            raise serializers.ValidationError(
                'Obj does not exist.'
            )

    class Meta:
        model = Employee
        fields = ['id', 'name']

class JobSerializer(WritableNestedModelSerializer):
    employee = SimpleEmployeeSerializer(many=False)

    class Meta:
        model = MpProject
        fields = [
            'id',
            'employee',
        ]

请不要担心这是否应该是一对一关系,我的模型在实践中更复杂。

我得到的错误是 ImproperlyConfigured: Field name 'name' is not valid for model 'Employee'. 我在没有实现 to_internal_value 时没有得到这个错误,但是我需要这个,因为我希望能够发布一个新的 {{1 }} 与 Job 格式。有人能告诉我为什么我会收到这个错误吗?

1 个答案:

答案 0 :(得分:0)

这是因为<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous"> <div class="container"> <div class="row"> <div class="col"> <input type="checkbox"> </div> <div class="col"> <p> Save My card for future payment</p> </div><br> </div> </div>

fields

您可以通过添加字段来解决此问题:

class Meta:
    model = Employee
    fields = ['id', 'name'] # <- this line
相关问题