Получена ошибка 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()
и попробуйте создать запись, как вы делали раньше. Вы увидите, что происходит.