Ошибка утверждения при попытке создать представление для обновления одного поля в модели
У меня есть модель, которая выглядит следующим образом
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=50, blank=True)
country = models.CharField(max_length=50, blank=True)
bio = models.CharField(max_length=500, blank=True)
profile_pic = models.ImageField(upload_to='profile/%Y/%m/%d', default='media/placeholder.png', blank=False,
null=False)
is_online = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
Я хотел бы создать конечную точку API для обновления конкретно поля is_active. Вот что у меня есть в моих представлениях для этого
class UpdateProfileActive(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = UpdateUserSerializer
lookup_field = 'profile.is_active'
def update(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance, data='profile.is_active', partial=True)
if serializer.is_valid():
serializer.save()
return Response({"message": "user is active field has been updated"})
else:
return Response({"message": "failed", "details": serializer.errors})
Вот мой сериализатор:
class UpdateUserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=False)
city = serializers.CharField(source='profile.city', allow_blank=True, required=False)
country = serializers.CharField(source='profile.country', allow_blank=True, required=False)
profile_pic = Base64ImageField(source='profile.profile_pic', max_length=None, use_url=True, required=False)
is_online = serializers.BooleanField(source='profile.is_online', required=False)
is_active = serializers.BooleanField(source='profile.is_active', required=False)
# serializers.ImageField(source='profile.profile_pic', use_url=True, required=False)
class Meta:
model = User
#, 'city', 'country', 'bio'
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'profile_pic', 'is_online', 'is_active']
# fields = UserDetailsSerializer.Meta.fields + ('city', 'country')
extra_kwargs = {'username': {'required': False},
'email': {'required': False},
'password': {'required': False},
'first_name': {'required': False},
'last_name': {'required': False},
'city': {'required': False},
'country': {'required': False},
'profile_pic': {'required': False},
'is_online': {'required': False},
'is_active': {'required': False},
}
def update(self, instance, validated_data):
profile_data = validated_data.pop('profile', {})
city = profile_data.get('city')
country = profile_data.get('country')
profile_pic = profile_data.get('profile_pic')
is_online = profile_data.get('is_online')
is_active = profile_data.get('is_active')
instance = super(UpdateUserSerializer, self).update(instance, validated_data)
profile = instance.profile
if profile_data:
if city:
profile.city = city
if country:
profile.country = country
if profile_pic:
profile.profile_pic = profile_pic
if is_online:
profile.is_online = is_online
if is_active:
profile.is_active = is_active
profile.save()
return instance
Когда я пытаюсь обновить это поле, я получаю ошибку:
AssertionError at /update_active/1/
Expected view UpdateProfileActive to be called with a URL keyword argument named "profile.is_active". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.