4

私はこのようなモデルを持っています

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

これの代わりに、このオブジェクトだけでなく、電子メールアドレスとすべてのユーザーをオブジェクトに表示したいと思います。

4

3 に答える 3

4

解決策は簡単でした。ToManyField私がUserオブジェクトに使用することになっていたのではなくForeignKey、すべてが修正されたことがわかりました。

于 2013-03-21T00:40:36.840 に答える
0

私は1つの問題で助けることができます:

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

.count()クエリの結果をリストに入れているので、それを呼び出すことはできません。len(followers)またはを使用しUser.objects.get(following__followers=user)ます。

コードの残りの部分はかなり奇妙ですが、私もそれに関する確かな問題を見ることができません。おそらく問題はにありUserResourceますか?おそらく837行目を見たいと思うでしょう。

于 2013-03-20T16:42:23.943 に答える
0

'RelatedManager' object has no attribute 'pk'おそらくTastyPieがオブジェクトを期待していたことを意味しますが、代わりに、 inがオブジェクトであることを確認するRelatedManagerようなものを指定したので、すべてのユーザーを反復処理する必要があります。connections.followingresultfor result in page.object_listconnections.following

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)

また、ユーザーとOneToOneの関係を持つモデルを用意するか、ユーザーモデルを拡張できるDjango 1.5にアップグレードすることで、ManyToManyフィールドを使用することを検討しましたか?そうすれば、独自の多対多関係を実装する代わりに、Djangoの組み込みの関係のすべての利点を利用できます。たとえば、そのユーザーをフォローしているすべてのユーザーに発言して取得するだけです。Profileuser.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)]
于 2013-03-16T23:33:42.233 に答える