gpt4 book ai didi

python - Django:使用GET(而不是PATCH)更新特定字段

转载 作者:行者123 更新时间:2023-12-03 16:11:10 25 4
gpt4 key购买 nike

语境

对于特定的用例,我需要能够使用GET请求而不是PATCH请求来更新Visitor模型的单个字段。

我的相关访客模型如下所示:

# models.py

class Visitor(models.Model):
visitor_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
customers = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer_visitors')
audiences = models.ManyToManyField(Audience, related_name='audience_visitors')
cid = models.CharField(max_length=255, unique=True)
uid = models.CharField(max_length=255)
cup = JSONField(null=True)

def __str__(self):
return self.cid

class Meta:
db_table = 'visitor'

我正在使用一个简单的序列化器,像这样:

# serializers.py

class VisitorSerializer(serializers.ModelSerializer):
class Meta:
model = Visitor
fields = ('customers', 'cid', 'uid', 'cup')

我可以只更新特定 cupVisitor字段,该字段使用具有PATCH的唯一 cid字段进行查找,如下所示:

# views.py

class VisitorViewSet(viewsets.ModelViewSet):
serializer_class = VisitorSerializer
queryset = Visitor.objects.all()
lookup_field = 'cid'

def list(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.serializer_class(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)

问题

问题是我无法使用GET请求基于给定的唯一 cup字段来更新Visitor的 cid字段。

我尝试了什么

正如 this answer by Uri Shalit所建议的那样,我尝试覆盖 get_serializer()中的 VisitorViewSet并尝试在 list()中使用它,如下所示:

# views.py

class VisitorViewSet(viewsets.ModelViewSet):
serializer_class = VisitorSerializer
queryset = Visitor.objects.all()
lookup_field = 'cid'

def get_serializer(self, *args, **kwargs):
kwargs['partial'] = True
return super(VisitorViewSet, self).get_serializer(*args, **kwargs)

def list(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)

但是,仅基于 cup字段更新特定访问者的 cid字段可与PATCH请求一起使用,而不能通过GET请求更新该字段。也没有错误。

预期行为

发出一个包含 cid的GET请求,以标识一个访问者和 cup以及需要为给定访问者更新的数据。我知道它违反了REST原则,但是对于此用例,我需要使用GET请求而不是PATCH请求来进行部分更新。

任何帮助或朝着正确方向的指点将不胜感激!

最佳答案

在模型中添加类方法。

class Visitor(models.Model):
visitor_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
customers = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer_visitors')
audiences = models.ManyToManyField(Audience, related_name='audience_visitors')
cid = models.CharField(max_length=255, unique=True)
uid = models.CharField(max_length=255)
cup = JSONField(null=True)

def __str__(self):
return self.cid

class Meta:
db_table = 'visitor'


@classmethod
def update_cup(cls, cid, cup_new):
instance = cls.objects.get(cid=cid)
instance.cup = new_cup
instance.save()
在ModelViewSet中重写 get_queryset方法,请参见下文:
IDK你如何计算new_cup我想你以queryparam的形式获取它
def get_queryset(self):
queryset = Visitor.objects.all()

cup_new = self.request.query_params.get('cup_new', None)
cid = self.request.query_params.get('cid', None)

[obj.update_cup(obj.cid, cup_new) for obj in queryset if obj.cid == cid]
return queryset

关于python - Django:使用GET(而不是PATCH)更新特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62341337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com