Lal*_*nar 6 django django-rest-framework
**尝试从一个端点创建两个对象(没有嵌套序列化器)。registration_no当尝试获取序列化器上的字段值时,我收到错误 ERROR: AttributeError at /migratestudent Got AttributeError StudentDataMigrateSerializer。序列化程序字段可能命名不正确,并且与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
Run Code Online (Sandbox Code Playgroud)
您在序列化器上定义这些字段:
class StudentDataMigrateSerializer(serializers.Serializer):
name = serializers.CharField()
sex = serializers.CharField()
registration_no = serializers.CharField()
Run Code Online (Sandbox Code Playgroud)
并在您的方法中返回student对象create:
def create(self,validated_data):
...
return student
Run Code Online (Sandbox Code Playgroud)
当您向此端点发出发布请求时,StudentDataMigrateCreateAPIVIew正在使用请求数据创建序列化程序 ( StudentDataMigrateSerializer) 并验证它。如果验证通过,它将调用create序列化器的方法。到现在为止一切都还好。创建实例后,视图还必须返回响应。所以它返回data序列化器的属性。
此时,serializer.data实际上是您在方法中返回的学生对象的表示create。您的序列化程序尝试根据其中定义的字段返回表示形式。
这些是您在序列化上定义的字段:name, sex, registration_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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3896 次 |
| 最近记录: |