Python列表不是列表时? list对象没有属性split

时间:2016-04-18 14:04:54

标签: python

我有一个发送到我的API的用户ID列表:

Users = ['x1','x2']

在我的序列化器创建方法中,我尝试迭代它们:

    users = validated_data.get('users', None)
    for user in users:
        print(user)
        print("===")

我收到的输出是:

> x1,x2
> ===

它不是迭代列表,而是输出为一行!这告诉我它不是一个列表,而是一个字符串,所以我检查了type(users),它给出了一个空白,即没有类型。

所以我尝试将用户分开users.split()然后我得到一个矛盾“”列表对象没有属性拆分“!

这里有什么问题,困惑?

3 个答案:

答案 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_validationto_internal_valueto_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

5 implementations of run_validation

以上评论ListSerializer告诉我们,我们可能在正确的位置:

# There's some replication of `ListField` here,
# but that's probably better than obfuscating the call hierarchy.

ListSerializervalidates each item (source),然后将其附加到名为ret的列表中。所以我们应该返回一个清单。

这里解决的难题是您的输入导致输出不正确,但是通过调用堆栈进行跟踪,代码似乎按预期工作。

修改

to_representation是否会使您的列表变得扁平化,因为它认为它是一本字典?