gpt4 book ai didi

Django REST框架: Get ID/URL during validation?

转载 作者:行者123 更新时间:2023-12-02 07:43:24 24 4
gpt4 key购买 nike

我有一个HyperlinkedModelSerializer。为了正确实现其 validate 方法,我需要访问正在验证的对象的主键URL - 如果它有一个,即如果它正在被编辑,而不是被创建。正确的做法是什么?

我尝试了很多方法,但唯一有效的方法是当序列化器实例化到对象的 id 字段时获取对象的 ID:

class BoxSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Box
fields = ('id', 'name', 'url')

def __init__(self, *args, **kwargs):
super(BoxSerializer, self).__init__(*args, **kwargs)
self.id = None \
if len(args) != 1 or not isinstance(args[0], Box) \
else args[0].id

def validate(self, data):
print(data)
return data

从序列化器的 validate 方法中访问正在验证的对象的 ID/URL 的正确方法是什么? data['id']data['url'] 都不存在。

<小时/>

urls.py:

urlpatterns = [
url(r'(?P<pk>[0-9]+)/$', views.BoxDetail.as_view(), name='box-detail'),
]

views.py:

class BoxDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Box.objects.all()
serializer_class = BoxSerializer

最佳答案

您可以通过self.instance访问正在编辑的对象的id

来自 Accessing the initial data and instance: 上的 DRF 序列化器文档

When passing an initial object or queryset to a serializer instance, the object will be made available as .instance. If no initial object is passed then the .instance attribute will be None.

由于您使用的是 HyperLinkedModelSerializer,因此在 PUT 请求作为 instance 属性设置时,您将可以访问正在编辑的对象序列化器。您可以使用此 instance 属性通过执行 self.instance.id 来访问正在编辑的对象的 id

您可以在 validate() 函数中编写验证逻辑,然后在变量 object_id 中获取对象 id 后。这不会影响创建请求,因为届时不会在序列化器上设置实例。

class BoxSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Box
fields = ('id', 'name', 'url')

def validate(self, data):
if self.instance: # 'instance' will be set in case of `PUT` request i.e update
object_id = self.instance.id # get the 'id' for the instance
# write your validation logic based on the object id here

return data

访问对象 ID 的另一种方法是通过序列化器 context 中的 view 对象访问 kwargs > 字典。

my_view = self.context['view'] # get the 'view' object from serializer context
object_id = my_view.kwargs.get('pk') # access the 'view' kwargs and lookup for 'pk'

关于Django REST框架: Get ID/URL during validation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31675038/

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