2014-09-04 123 views
2

我正在構建一個Django應用程序,通過LinkedIn API下載一些數據並將其存儲到MongoDB。我正在使用python-linkedin庫。一個函數獲取組帖子並將這些帖子作爲字典對象返回。Python,MongoDB,Mongoengine - TypeError:字符串索引必須是整數,而不是str

測試時我正在以下類型錯誤:

====================================================================== 
ERROR: test_get_or_create_post (providers.linkedin.tests.LinkedInTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
File "/Users/josephfusaro/explorro/explorro/app/providers/linkedin/tests.py", line 36, in test_get_or_create_post 
api.get_or_create_post(a1) 
File "/Users/josephfusaro/explorro/explorro/app/providers/linkedin/api.py", line 134, in get_or_create_post 
existing_post = Post.objects.get(post_id=post['id']) 

TypeError: string indices must be integers, not str 

這裏是返回,表示LinkedIn組職位和創建該貼的用戶一個字典對象的例子。

{u'creator': 
    {u'firstName': u'Joe', 
    u'headline': u'General Manager', 
    u'id': u'Wr4g5xEN4I', 
    u'lastName': u'P.', 
    u'pictureUrl': u'http://m.c.lnkd.licdn.com/mpr/mprx/0_x...xJkwu'}, 
u'id': u'g-60415-S-5913079393848621697', 
u'title': u'How do you use LinkedIn groups for business?', 
u'type': {u'code': u'standard'} 
} 

我試圖在MongoDB中存儲這些對象。這裏是(大部分)的documents.py文件:

# documents.py 

from mongoengine import (
    Document, 
    ReferenceField, 
    StringField, 
    IntField, 
    DateTimeField, 
    URLField, 
    DictField, 
    ListField, DoesNotExist, NotUniqueError) 
from abc import ABCMeta, abstractmethod  


class LinkedInUser(Document): 
    linkedin_user_id = StringField(required=True) 
    screen_name = StringField() 
    first_name = StringField() 
    last_name = StringField() 
    description = StringField() 
    url = URLField() 
    profile_image_url = URLField() 


class Post(Document): 
    linkedin_user = ReferenceField(LinkedInUser,required=True) 
    post_id = StringField(required=True) 
    title = StringField() 

這裏是需要一個後(預期爲一個字典),並將其保存的MongoDB

# api.py 

def get_or_create_post(post): 
    try: 
     existing_post = Post.objects.get(post_id=post['id']) 
     return existing_post 
    except DoesNotExist: 
     try: 
      new_post = Post() 
      new_post.linkedin_user = get_or_create_linkedin_user(
       post['creator'] 
      ) 
      new_post.post_id = post['id'] 
      new_post.title = post['title'] 
      new_post.save() 

      return new_post 
     except NotUniqueError: 
      return get_or_create_post(post) 

注意的功能,我正在錯誤,同時運行的Django測試

# tests.py 

from django.test import TestCase 
from .models import OauthToken 
from accounts.models import EmailUser 
from . import api 


class LinkedInTestCase(TestCase): 
    '''To run these tests: python app/manage.py test linkedin''' 

    def setUp(self): 
     cust_user = EmailUser.objects.create() 
     oauth = OauthToken.objects.create(user=cust_user) 
     oauth.access_token = "AQUaXm...klsdfQ" 
     oauth.save() 

    def test_get_or_create_post(self): 
     oauth = OauthToken.objects.get(user=0) 
     auth = api.get_linkedin_api(access_token=oauth.access_token) 
     posts = api.get_linkedin_group_digest(auth) # create generator object and set to 'posts' 
     a = next(posts) # get item from generator object above 
     a1 = ["values"][0] # Get first post from dict 
     api.get_or_create_post(a1) 

這是Django的OR的限制M + MongoDB,還是我做了其他的錯誤?

+1

哪裏是'api.get_or_create_post代碼(A1) '?請檢查'a1'的值,它必須是'dict'。 – Nilesh 2014-09-04 03:38:23

+1

我剛剛添加了tests.py以進一步說明我如何獲取錯誤。 – 2014-09-04 03:46:52

+0

用回答:) – Nilesh 2014-09-04 03:51:18

回答

2

問題是

a1 = ["values"][0] 

檢查輸出

>>> a1 = ["values"][0] 
>>> print a1 
values 

您可能需要編寫像

a1 = a["values"][0] 
+0

啊 - 謝謝你!看起來這是另一種疲倦,疲憊的眼睛:) – 2014-09-04 03:54:28

相關問題