2015-10-04 199 views
0

我试图让Django的休息frameworki API工作,我发文件api.py与函数调用keyword_organic返回输出是这样的:函数返回不能正常工作

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

,如果我用这个:

ress = keyword_organic(keyword) 
print 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功能的底部,万一东西是有错:

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

return listof 
+2

你的函数返回json作为字符串吗? –

+0

是的,但我认为它并不重要,因为如果我只是创建新变量并将该字符串放在那里,它会将它传递到序列化程序和数据库。 –

+1

@NemaGa:当然重要;一个字符串不是一个字典。 'var'是一个字典,'ress'是一个字符串。 –

回答

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字典,而不是一个字符串。根据你发布的最小数量来判断,你确实做了一件非常奇怪的事情(通过生成一个字符串将列表变成字典?)。

+0

工作就像一个魅力,谢谢。 –

1

您需要通过字典来串行因为data参数,而不是传递字符串。

为什么代码ress不起作用?

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

为什么用var代码有效?

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