代码之家  ›  专栏  ›  技术社区  ›  Jonathan

“RelatedManager”对象没有属性“pk”

  •  4
  • Jonathan  · 技术社区  · 13 年前

    我有一个模型看起来像这样

    class Connections(models.Model):
        following = models.ForeignKey(
            User, related_name='following'
        )
        followers = models.ForeignKey(
            User, related_name='followers'
        )
        def __unicode__(self):
            return u'%s, %s' % (self.following.username, self.followers.username)
        class Meta:
            unique_together = (('following', 'followers'), )
    

    然后在TastyPie中,我使用以下代码提取以下用户

    class ConnectionsResource(ModelResource):
        user_following = fields.ForeignKey(UserResource, 'following')
        user_follower = fields.ForeignKey(UserResource, 'followers')
        class Meta:
            queryset = Connections.objects.all()
            resource_name = 'connections'
    
        def prepend_urls(self):
            return[
                url(r"^(?P<resource_name>%s)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('connections'), name="api_connections"),
            ]
    
        def connections(self,request,**kwargs):
            if request.user and request.user.is_authenticated():
                #Scribble Comments
                if request.GET.get('followers', ''):
                    user = request.user
                    followers = [connections.following for connections in user.followers.all()]
                    followers_count = 1
                    if followers_count > 0:
                        paginator = Paginator(followers, 20)
                        try:
                            page = paginator.page(int(request.GET.get('page', 1)))
                        except InvalidPage:
                            return self.create_response(request, { 'success': False, 'reason':'no more pages' })
                        objects = []
                        for result in page.object_list:
                            bundle = self.build_bundle(obj=result, request=request)
                            bundle = self.full_dehydrate(bundle)
                            objects.append(bundle)
                        followers_list = {
                        'followers_count': followers_count,
                        'followers' : objects,
                        'success': True,
                        }
                        self.log_throttled_access(request)
                        return self.create_response(request, followers_list)
                    else:
                        return self.create_response(request, { 'success': False, 'reason':'No Followers' })
                else:
                    return self.create_response(request, { 'success': False, 'reason':'Wrong Query'})
            else:
                return self.create_response(request, { 'success': False, 'reason':'User not Logged in'})
    
        def determine_format(self, request):
            return 'application/json'
    

    但我一直在努力 'RelatedManager' object has no attribute 'pk' 错误我不知道为什么

    追溯:

    traceback: "Traceback (most recent call last): 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/resources.py", line 202, in wrapper response = callback(request, *args, **kwargs) 
    File "/Users/jonathan/virtualenvs/myproject/bin/django_worksquid/scribbler/api.py", line 547, in connections bundle = self.full_dehydrate(bundle) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/resources.py", line 837, in full_dehydrate bundle.data[field_name] = field_object.dehydrate(bundle) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/fields.py", line 729, in dehydrate return self.dehydrate_related(fk_bundle, self.fk_resource) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/fields.py", line 557, in dehydrate_related return related_resource.get_resource_uri(bundle) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/resources.py", line 784, in get_resource_uri return self._build_reverse_url(url_name, kwargs=self.resource_uri_kwargs(bundle_or_obj)) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/resources.py", line 763, in resource_uri_kwargs kwargs.update(self.detail_uri_kwargs(bundle_or_obj)) 
    File "/Users/jonathan/virtualenvs/myproject/lib/python2.7/site-packages/tastypie/resources.py", line 2371, in detail_uri_kwargs kwargs[self._meta.detail_uri_name] = getattr(bundle_or_obj.obj, self._meta.detail_uri_name) AttributeError: 'RelatedManager' object has no attribute 'pk' "
    

    编辑

    当我改变的时候 followers_count = 1 followers_count = followers.count() 它给了我

    "count() takes exactly one argument (0 given)"  error
    

    编辑

    我终于意识到追随者是一个列表,而不是一个对象,所以我把代码改成了

    def connections(self,request,**kwargs):
        if request.user and request.user.is_authenticated():
            #Scribble Comments
            if request.GET.get('followers', ''):
                user = request.user
                followers = [connections.following for connections in user.followers.all()]
                users_id = [s.id for s in followers]
                users=User.objects.filter(id__in = users_id)
                users_count = users.count()
                users_list = {
                'users_count': users_count,
                'users' : users,
                'success': True,
                }
                return self.create_response(request, users_list)
            else:
                return self.create_response(request, { 'success': False, 'reason':'Wrong Query'})
        else:
            return self.create_response(request, { 'success': False, 'reason':'User not Logged in'})
    

    现在我确实得到了输出,但我是从对象的角度得到的,比如

    success: true,
    users: "[<User: abc>, <User: test>, <User: abc2>, <User: test2>]",
    users_count: 4
    

    相反,我希望我的对象显示电子邮件地址和所有用户,而不仅仅是这个对象。

    3 回复  |  直到 12 年前
        1
  •  4
  •   Jonathan    13 年前

    解决方案很简单。它吐出来了,我本该用的 ToManyField 对于用户对象不是 ForeignKey ,这就解决了一切!

        2
  •  0
  •   lyschoening    13 年前

    我可以在一个问题上提供帮助:

    followers = [connections.following for connections in user.followers.all()]
    

    你不能打电话 .count() 这是因为您要将查询结果放入一个列表中。使用 len(followers) User.objects.get(following__followers=user) .

    代码的其余部分很奇怪,但我也看不出它有什么问题。也许问题在于 UserResource ? 你可能想看看第837行。

        3
  •  0
  •   Ric    13 年前

    'RelatedManager' object has no attribute 'pk' 可能意味着TastyPie期待着一个对象,但你却给了它一个 RelatedManager 这就像 connections.following 我会确保 result 在里面 for result in page.object_list 是一个对象,您可能需要遍历所有 连接。跟随 用户。

    for result in page.object_list:
        print result
        for following_user in result.all():
            print following_user
            bundle = self.build_bundle(obj=following_user, request=request)
            bundle = self.full_dehydrate(bundle)
            objects.append(bundle)
    

    你有没有考虑过只使用 ManyToMany field 要么也有 Profile 与用户有OneToOne关系的模型,或升级到Django 1.5,允许 extending the user model ? 这样,您就可以使用Django内置关系的所有好处,而不是实现自己的ManyToMany关系,比如说 user.followers.all() 并获取所有跟随该用户的用户。

    这样的东西可以提取信息

    users = [{
                 'email': u.email, 
                 'name': u.name,
                 ...
             } for u in User.objects.filter(id__in = users_id)]
    

    尽管您可能应该尝试使用 build_bundle

    users = [self.full_dehydrate(self.build_bundle(obj=u, request=request)) 
             for u in User.objects.filter(id__in = users_id)]