【问题标题】:Got AttributeError when attempting to get a value for field尝试获取字段值时出现 AttributeError
【发布时间】:2019-04-16 12:46:05
【问题描述】:

**在尝试从一个端点创建两个对象(没有嵌套序列化程序)时。我有一个错误 错误: /migratestudent 的 AttributeError 尝试在序列化程序 StudentDataMigrateSerializer 上获取字段 registration_no 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Student 实例上的任何属性或键都不匹配。 原始异常文本为:'Student' object has no attribute 'registration_no'

class Student(models.Model):
    name = models.CharField(max_length=300)
    sex  = models.CharField(choices=SEX_CHOICES,max_length=255, null=True)
    Category = models.CharField(max_length=100, null=True)

    def __str__(self):
        return self.name


class Registration(models.Model):
    registration_no = models.CharField(max_length=255, unique=True)
    student = models.OneToOneField(Student, 
    on_delete= models.CASCADE, related_name='registration')

    def __str__(self):
    return self.registration_no

class StudentDataMigrateSerializer(serializers.Serializer):

    name = serializers.CharField()
    sex = serializers.CharField()
    registration_no = serializers.CharField()
    #registration_no = serializers.CharField()


    def create(self,validated_data):
        name = validated_data.pop('name')
        sex = validated_data.pop('sex')
        registration_no= validated_data.pop('registration_no')
        #registration_no = validated_data.pop('registration_no')
        #check for existence of registration number

        #Student.objects.CheckRegistration(name, '4')

        try:
            regn = Registration.objects.get('registration_no')
        except:
            student = Student.objects.create(name=name, sex=sex)
            registration = Registration.objects.create(
                    registration_no=registration_no,
                    student=student)

        return student

class StudentDataMigrateCreateAPIVIew(ListCreateAPIView):
    serializer_class= StudentDataMigrateSerializer

    def get_queryset(self):
        student = Student.objects.all()
        return student

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您正在序列化程序上定义这些字段:

    class StudentDataMigrateSerializer(serializers.Serializer):
        name = serializers.CharField()
        sex = serializers.CharField()
        registration_no = serializers.CharField()
    

    并在您的 create 方法中返回 student 对象:

        def create(self,validated_data):
            ...
            return student
    

    当您向此端点发出 post 请求时,StudentDataMigrateCreateAPIVIew 正在使用请求数据创建序列化程序 (StudentDataMigrateSerializer) 并对其进行验证。如果验证通过,它会调用序列化程序的create 方法。直到现在一切都很好。创建实例后,视图还必须返回响应。所以它返回序列化程序的data 属性。

    此时,serializer.data 实际上是您在create 方法中返回的学生对象的表示。您的序列化程序会尝试根据其中定义的字段返回表示形式。

    这些是您在序列化时定义的字段:namesexregistration_no。但是Student 模型,因此student 对象没有registration_no 字段。因此,当您的序列化程序尝试在 student 对象上获取此字段时,它会失败。

    您可以将registration_no 字段设为write_only,这样它就不会在响应中返回。

    class StudentDataMigrateSerializer(serializers.Serializer):
        name = serializers.CharField()
        sex = serializers.CharField()
        registration_no = serializers.CharField(write_only=True)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2023-02-03
    • 2022-11-29
    相关资源
    最近更新 更多