AttributeError: объект 'NoneType' не имеет атрибута '_meta' при обновлении данных с помощью вложенных сериализаторов через вызов PATCH в Django Rest Framework
Я хочу обновить данные модели с помощью вложенных сериализаторов через вызов PATCH в DRF.
У меня есть пользовательские User Модель, Country, City, Detail Модель.
У меня есть MainUserSerializer, CountrySerializer, CitySerializer и UserSerializer, и у меня есть UserAPI представление.
Ниже мой models.py:
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=254, null=True, blank=True)
email = models.EmailField(max_length=254, unique=True)
first_name = models.CharField(max_length=254, null=True, blank=True)
last_name = models.CharField(max_length=254, null=True, blank=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
class Country(models.Model):
name = models.CharField(max_length=100, default='c')
def __str__(self):
return ("{}".format(self.name))
class City(models.Model):
name = models.CharField(max_length=100 ,default='c')
country = models.ForeignKey(Country, on_delete=models.CASCADE)
def __str__(self):
return ("{} ({})".format(self.name, self.country.name))
class Detail(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
gender = models.CharField(max_length=20, default='g')
age = models.IntegerField(default=0)
country = models.IntegerField(default=1)
city = models.IntegerField(default=1)
def __str__(self):
return ("{} ({} {})".format(self.user.email, self.user.first_name, self.user.last_name))
мой serializers.py:
class MainUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'first_name', 'last_name', 'email')
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
fields = ('name',)
class CountrySerializer(serializers.ModelSerializer):
city = CitySerializer()
class Meta:
model = Country
fields = ('name', 'city')
class UserSerializer(serializers.ModelSerializer):
usr = MainUserSerializer()
country = CountrySerializer()
city = CitySerializer()
class Meta:
model = Detail
fields = ('usr', 'gender', 'age', 'country', 'city')
def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
instance.save()
return instance
и мой views.py это:
class UserAPI(generics.GenericAPIView):
permission_classes = [AllowAny]
serializer_class = UserSerializer
def get(self, request, id):
detail = Detail.objects.get(user=User.objects.get(pk=id))
usr = User.objects.get(pk=id)
data = {
'id': usr.id,
'username': usr.username,
'first_name': usr.first_name,
'last_name': usr.last_name,
'email': usr.email,
'gender': detail.gender,
'age': detail.age,
'country': detail.country,
'city': detail.city
}
return Response(data)
def patch(self, request, id):
usr = User.objects.get(pk=id)
detail = Detail.objects.get(user=usr)
serializer = self.get_serializer(detail, data=request.data, partial=True)
print(request.POST)
if serializer.is_valid():
serializer.save()
print("SUCCESS")
return Response(code=200)
return JsonResponse(data="wrong parameters", safe=False)
Подробности ошибки:
Имя ошибки: AttributeError: 'NoneType' object has no attribute '_meta'
Полная ошибка:
Кто-нибудь, пожалуйста, объясните мне, почему я получаю эту ошибку.
Вы написали usr вместо user в вашем сериализаторе:
class UserSerializer(serializers.ModelSerializer):
user = MainUserSerializer() # Here
country = CountrySerializer()
city = CitySerializer()
class Meta:
model = Detail
fields = ('user', 'gender', 'age', 'country', 'city') # Here
def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
instance.save()
return instance