Получил AttributeError при попытке получить значение для поля - PullRequest
1 голос
/ 16 апреля 2019

** При попытке создать два объекта (без вложенного сериализатора) из одной конечной точки.Я получил ошибку ОШИБКА: AttributeError at / migratestudent Получил AttributeError при попытке получить значение для поля registration_no на сериализаторе 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

1 Ответ

0 голосов
/ 16 апреля 2019

Вы определяете эти поля на вашем сериализаторе:

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

И возвращение student объекта в вашем create методе:

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

Когда вы отправляете запрос к этой конечной точке, 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)
...