我正在尝试使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
答案 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
相同的输出。
您可以使用ress
将ast.literal_eval
变成字典:
import ast
ress_as_dictionary = ast.literal_eval(ress)
但是,让keyword_organic()
函数返回Python字典而不是字符串会好得多。从您发布的最小量来判断,您确实做了一些非常奇怪的事情(通过生成字符串将列表转换为字典?)。
答案 1 :(得分:1)
您需要将字典作为data
参数传递给序列化程序,而不是传递字符串。
为什么ress
的代码不起作用?
这是因为您将字符串传递给SemrushSerializer
,它需要数据字典而不是字符串对象。如果没有这个,序列化程序将无法为字段生成映射,也无法生效。
为什么使用var
的代码有效?
在这里,您将var
作为包含u1
和u2
键的字典传递。序列化程序可以将输入键映射到其字段,并且有效,因此可以正确保存对象。