如何使用 Djangorestframework 中的 UpdateAPIView 更新模型中的单个字段?

Tar*_*ani 3 django django-generic-views python-3.x django-serializer django-rest-framework

我正在学习通用视图并创建一些 API。如何更新字段:mobile来自型号:Contacts?

我想从 URL 获取用户 ID (mobile/update/user_id),但是在创建查询集时它不起作用。我想做一些像这里提到的那样的事情:

#queryset = Contacts.objects.filter(id=Usertab.objects.filter(id=self.kwargs['id']).first().contact.id))
Run Code Online (Sandbox Code Playgroud)
class UpdateMobileAPIView(generics.UpdateAPIView):
    queryset = Contacts.objects.filter(pk=Usertab.objects.all())

    serializer_class = ContactsSerializer
    lookup_field = 'pk'

    def update(self,instance,request):
        instance = self.get_object()
        serializer= self.get_serializer(instance,data=request.data,partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response({"message":"mobile number updated successfully"})

        else:
            return Response({"message":"failed"})

Run Code Online (Sandbox Code Playgroud)

这些是模型

class Contacts(models.Model):

    mobile = models.IntegerField(null=False)
    Landline = models.IntegerField(null=False)
    whats_app = models.IntegerField(null=False)


class Usertab(models.Model):

    username = models.CharField(max_length=255,null=False,blank=False)
    address = models.CharField(max_length=255,null=False,blank=False)
    pin_code = models.CharField(max_length=255,null=False,blank=False)
    contact = models.ForeignKey(Contacts,related_name="contacts_user")


class Email(models.Model):

    user = models.ForeignKey(Usertab,related_name="user_email")
    email = models.CharField(max_length=255,null=False,blank=False)
    is_verified = models.BooleanField(default=False)

Run Code Online (Sandbox Code Playgroud)

这是序列化器

class ContactsSerializer(ModelSerializer):

    class Meta:
        model = Contacts
        fields = '__all__'

    def update(self, instance, validated_data):
        instance.mobile = validated_data.get('mobile', instance.mobile)
        instance.save()
        return instance
Run Code Online (Sandbox Code Playgroud)
TypeError: update() got an unexpected keyword argument 'pk'
Run Code Online (Sandbox Code Playgroud)

小智 9

我认为错误在于你的queryset价值。如果目标是联系人模型中的字段,则只需将查询集作为联系人模型中的所有项目即可。这样,查找字段可用于过滤整个数据集并编辑适当的条目。

class UpdateMobileAPIView(generics.UpdateAPIView):
    queryset = Contacts.objects.all()
    serializer_class = ContactsSerializer
    lookup_field = 'pk'

    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=True)

        if serializer.is_valid():
            serializer.save()
            return Response({"message": "mobile number updated successfully"})

        else:
            return Response({"message": "failed", "details": serializer.errors})
Run Code Online (Sandbox Code Playgroud)