我有一个发送到我的API的用户ID列表:
Users = ['x1','x2']
在我的序列化器创建方法中,我尝试迭代它们:
users = validated_data.get('users', None)
for user in users:
print(user)
print("===")
我收到的输出是:
> x1,x2
> ===
它不是迭代列表,而是输出为一行!这告诉我它不是一个列表,而是一个字符串,所以我检查了type(users)
,它给出了一个空白,即没有类型。
所以我尝试将用户分开users.split()
然后我得到一个矛盾“”列表对象没有属性拆分“!
这里有什么问题,困惑?
答案 0 :(得分:2)
用户似乎是一个如下所示的列表:['x1,x2']
。而不是你期望的:['x1','x2']
您可以先使用ast.literal_eval
制作一个列表,也可以只拆分一个元素:
users = ['x1,x2']
for user in users[0].split(','):
print(user)
print('===')
输出:
>>> users = ['x1,x2']
>>> for user in users[0].split(','):
... print(user)
... print('===')
x1
===
x2
===
根据你的评论:
from ast import literal_eval
users = ['[1,2]']
users = literal_eval(users[0])
for user in users:
print(user)
print('===')
输出:
1
===
2
===
users = ['[x1,x1]']
:
users = ['[x1,x1]']
users = users[0][1:-1]
for user in users.split(','):
print(user)
print('===')
答案 1 :(得分:1)
看起来users
是列表,只有一个项目x1,x2
:
>>> users = ['x1,x2']
>>> for user in users:
... print(user)
... print("===")
...
x1,x2
===
答案 2 :(得分:1)
其他人指出,您似乎有一个包含单个字符串['x1, x2']
的列表。
我看了一下Django REST框架的内部结构,它肯定会返回一个列表。
ListField继承自Field,后者定义了一些方法,包括run_validation
,to_internal_value
和to_representation
。
其中两个方法是抽象的,其中一个,run_validation
实际上通过调用self.to_internal_value(data)来调用验证。
因此,要查看验证器正在做什么,我们必须查看ListField的to_internal_value
实现。
to_internal_value
内的评论说明了这一点:
"""
List of dicts of native values <- List of dicts of primitive datatypes.
"""
然后检查无效的输入类型,最后调用run_validation
。
根据我的IDE,Django REST Framework中有5个run_validation
实现。最相关的可能是ListSerializer
。
以上评论ListSerializer
告诉我们,我们可能在正确的位置:
# There's some replication of `ListField` here,
# but that's probably better than obfuscating the call hierarchy.
ListSerializer
类validates each item (source),然后将其附加到名为ret
的列表中。所以我们应该返回一个清单。
这里解决的难题是您的输入导致输出不正确,但是通过调用堆栈进行跟踪,代码似乎按预期工作。
修改强>
to_representation是否会使您的列表变得扁平化,因为它认为它是一本字典?