Python,MongoDB,Mongoengine-TypeError:字符串索引必须是整数,而不是s

2024-09-28 17:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个Django应用程序,通过LinkedIn api下载一些数据并将其存储到MongoDB。我正在使用python-linkedin库。一个函数获取组post并将这些post作为dict对象返回。

测试时,我收到以下类型错误:

 ======================================================================
 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

下面是返回的dict对象的一个示例,它表示LinkedIn组post和创建post的用户。

{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()

下面是一个函数,它接受post(预期为dict)并将其保存为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 ORM+MongoDB的限制,还是我做错了其他事情?


Tags: orfrompytestimportapiidnew