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
Вернуться на верх