python - 将对象的 URL 转换为其数据库实例
问题描述
我在我的视图中创建了一个额外的函数,它接收一个包含对某些 ResourceGroup 对象的超链接引用的列表,但我不知道如何将它们转换为数据库实例
class ResourceViewSet(viewsets.ModelViewSet):
queryset = Resource.objects.all()
serializer_class = ResourceSerializer
@action(methods=['put'], detail=True)
def groups_append(self, request, pk=None):
instance = self.get_object()
groups = request.data.get("groups")
for resource_group in groups:
instance.groups.add(WHAT_HERE(resource_group))
instance.save()
return Response(self.get_serializer(instance, many=False).data)
这是请求:
PUT http://.../api/resources/1/groups_append/
与身体:
{"groups": ["http://.../api/resource_groups/1/", ...]}
资源序列化器:
class ResourceSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Resource
fields = ('resource_id', 'object_id', 'type', 'system', 'path', 'groups', 'job_set')
def update(self, instance, validated_data):
instance.object_id = validated_data.get('object_id', instance.object_id)
instance.type = validated_data.get('type', instance.type)
instance.system = validated_data.get('system', instance.system)
instance.path = validated_data.get('path', instance.path)
instance.save()
return instance
资源组序列化器:
class ResourceGroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = ResourceGroup
fields = ('resource_group_id', 'label', 'resource_set')
def update(self, instance, validated_data):
instance.label = validated_data.get('label', instance.label)
instance.save()
return instance
解决方案
用于HyperlinkedRelatedField
组中ResourceSerializer
或仅为此操作创建一个新的序列化程序(主要思想是使用序列化程序获取数据,而不仅仅是直接从请求正文中获取数据),如下所示:
class ResourceSerializer(serializers.HyperlinkedModelSerializer):
groups = serializers.HyperlinkedRelatedField(
many=True,
read_only=True,
view_name='groups-detail' ## name of the groups detail url
)
class Meta:
model = Resource
....
然后编辑您的操作,如下所示:
@action(methods=['put'], detail=True)
def groups_append(self, request, pk=None):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
### then get the groups from the validated data
groups = serializer.validated_data.get('groups', [])
....
....
参考:
1-超链接相关字段
推荐阅读
- php - 我不能使用 php 的 pda
- python-3.x - 通过 modbus tcp/ip 读取数字输入时出现 GUI 错误 tkinter 的问题
- xml - 一个 XML 文件可以有多个 XSD 吗?
- c# - 安装后报告 RDLC 不显示在新项目面板中没有选项报告和报告 wiz Visual Studio 2019
- android - 如何在我的二维码内容中添加冒号 (:)?
- tensorflow - mean_squared_error 在 keras 中翻译成什么
- html - 替换vb.net中的多个html标签
- selenium - Selenium IDE 登录两次
- java - RecyclerView的resize项(ConstraintLayout, Kotlin)
- python - 在弹性豆茎烧瓶应用程序上保存和访问文件?