函数返回不正常

时间:2015-10-04 09:17:06

标签: python django

我正在尝试使django rest frameworki api工作,我使用名为keyword_organic的函数创建文件api.py ,返回如下输出:

{'u1': 'https://en.wikipedia.org/wiki/Yellow', 'u2': 'https://en.wikipedia.org/wiki/Yellow_color'}

如果我使用它:

ress = keyword_organic(keyword)
print ress

然后它打印出我上面给出的确切输出。所以我的理解' ress'变量保持这个字符串正确吗?

但是,当我尝试使用此函数并传递输出太序列化器时,它只是不起作用..这里是代码:

ress = keyword_organic(keyword)

serializer = SemrushSerializer(data=ress)

if serializer.is_valid():
    serializer.save()

但是,如果我只是制作新变量:

var = {'u1': 'https://en.wikipedia.org/wiki/Yellow', 'u2': 'https://en.wikipedia.org/wiki/Yellow_color'}

将这一个直接传递给序列化程序,它可以工作(data=var

我也会从keyword_organic粘贴api.py函数的底部,以防出现问题:

# ....
listof = str(listof)
listof = listof.translate(None, '{}')
table = string.maketrans('[]', '{}')
listof = listof.translate(table)

return listof

2 个答案:

答案 0 :(得分:3)

你的keyword_organic()函数返回一个字符串,一个看起来像Python文字的字符串(用字符串键和值生成字典的语法)。 不是 Python字典。

另一方面,

var是一本字典。要重新创建ress值,您必须将var设置为:

var = "{'u1': 'https://en.wikipedia.org/wiki/Yellow', 'u2': 'https://en.wikipedia.org/wiki/Yellow_color'}"

注意引号;打印var仍会生成与打印ress相同的输出。

可以使用ressast.literal_eval变成字典:

import ast
ress_as_dictionary = ast.literal_eval(ress)

但是,让keyword_organic()函数返回Python字典而不是字符串会好得多。从您发布的最小量来判断,您确实做了一些非常奇怪的事情(通过生成字符串将列表转换为字典?)。

答案 1 :(得分:1)

您需要将字典作为data参数传递给序列化程序,而不是传递字符串。

为什么ress的代码不起作用?

这是因为您将字符串传递给SemrushSerializer,它需要数据字典而不是字符串对象。如果没有这个,序列化程序将无法为字段生成映射,也无法生效。

为什么使用var的代码有效?

在这里,您将var作为包含u1u2键的字典传递。序列化程序可以将输入键映射到其字段,并且有效,因此可以正确保存对象。