Получена ошибка AttributeError при попытке получить значение для поля `name` на сериализаторе `BusinessSerializer`.

Я получаю эту ошибку при попытке сохранить запись с помощью rest

AttributeError в /business/ Получена ошибка AttributeError при попытке получить значение для поля name на сериализаторе BusinessSerializer. Поле сериализатора может быть названо неверно и не совпадать с атрибутом или ключом экземпляра User. Оригинальный текст исключения был: 'User' object has no attribute 'name'.

почему пытается найти поле name в объекте user, когда бизнес-объект уже имеет это поле

views.py

class BusinessViewSet(viewsets.ModelViewSet):
    serializer_class = BusinessSerializer
    queryset = Business.objects.all()
    def create(self,request):
        serializer = BusinessSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

    

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        businessRecord = serializer.save()
        return Response({
            "business": BusinessSerializer(businessRecord, context=self.get_serializer_context()).data,
        })

models.py

class Business(models.Model):
    businessOwner = models.OneToOneField(User,blank=True,null=True,on_delete=models.CASCADE) # first name, last name, username, email, password etc. present in this model
    name = models.TextField()
    mobileNumber = PhoneField(help_text='Mobile Number')
    businessLocation = models.PointField()
    created = models.DateTimeField(auto_now_add=True)
    businessType = models.CharField(max_length = 30,choices = BUSINESS_TYPE_CHOICES,default = 'Business')
    address = models.TextField()
    businessCategory = models.ManyToManyField(Category, related_name='Bcategory', blank=True)
    hashTags = models.ManyToManyField(HashTag, related_name='Bhashtag', blank=True)
    socialMediaAccountLink = models.URLField(max_length=400, blank=True,null=True)
    socialMediaType = models.CharField(max_length=30, choices=SOCIAL_MEDIA_TYPE_CHOICES, default='Instagram')

    class Meta:
        indexes = [
            models.Index(fields=['businessLocation', 'businessType','name','businessOwner']),
        ]

serializers.py

class BusinessOwnerSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email', 'password','first_name','last_name')
        extra_kwargs = {'username': {'allow_null': True,'allow_blank': True},
                        'email': {'allow_null': True,'allow_blank': True},
                        'password': {'allow_null': True,'allow_blank': True},
                        'first_name': {'allow_null': True,'allow_blank': True},
                        'last_name': {'allow_null': True,'allow_blank': True}}

class BusinessSerializer(serializers.ModelSerializer):
    offers = serializers.SerializerMethodField('get_offers', allow_null=True)
    posts = serializers.SerializerMethodField('get_reviewposts', allow_null=True)
    medias = serializers.SerializerMethodField('get_business_media', allow_null=True)
    Owner = BusinessOwnerSerializer(allow_null=True)
    def get_offers(self,request):
        if request=="GET":
            offers = Offer.objects.filter(business=self)
            serializer = OfferSerializer(instance=offers, context=self.context, many=True, read_only=True)
            return serializer.data

    def get_reviewposts(self,request):
        if request == "GET":
            posts = Post.objects.filter(business=self).filter(postType='Review')
            serializer = PostSerializer(instance=posts, context=self.context, many=True, read_only=True)
            return serializer.data

    def get_business_media(self,request):
        if request == "GET":
            media = BusinessMedia.objects.filter(business=self).filter(postType='Review')
            serializer = BusinessMediaSerializer(instance=media, context=self.context, many=True, read_only=True)
            return serializer.data

    class Meta:
        model = Business
        extra_kwargs = {'password': {'write_only': True},'Owner': {'allow_null': True,'allow_blank': True}}
        #fields = "__all__"
        exclude = ["businessOwner"]
    def create(self, validated_data):
        if validated_data['Owner']['username'] != '':
            user = User.objects.create_user(validated_data['Owner']['username'], email= validated_data['Owner']['email'], password= validated_data['Owner']['password'])
            return user
        return User()

я пытался найти соответствующие решения, но ничего не получилось

Я не знаю, имеет ли это значение. Но вы не должны возвращать User экземпляров из BusinessSerializer.create. Он должен возвращать Business экземпляров (например, посмотрите на this). Возможно, Django пытается сериализовать экземпляр User в экземпляр Business и терпит неудачу со странным сообщением об ошибке. Я бы начал оттуда и посмотрел, к чему это приведет.

Кроме того, Django предлагает трассировки, которые могут помочь в вашем случае. Попробуйте взглянуть на них или опубликуйте их здесь для справки.

Более того, вы можете использовать отладчик и посмотреть, какие данные доступны в вашем методе create. Просто добавьте оператор import pdb; pdb.set_trace() и попробуйте создать запись, как вы делали раньше. Вы увидите, что происходит.

Вернуться на верх