6

TastyPie で複数のリソースを組み合わせるにはどうすればよいですか? 結合したい 3 つのモデルがあります: ユーザー、プロファイル、投稿です。

理想的には、ユーザー内にネストされたプロファイルが必要です。UserPostResource からユーザーとすべてのプロファイルの場所の両方を公開したいと思います。ここからどこへ行けばいいのかわからない。

class UserResource(ModelResource):

    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        fields = ['username','id','date_joined']

        #Improper Auth
        authorization = Authorization()

class UserProfileResource(ModelResource):

    class Meta:
        queryset = UserProfile.objects.all()
        resource_name = 'profile'


class UserPostResource(ModelResource):
    user = fields.ForeignKey(UserResource,'user', full=True)


    class Meta:
        queryset = UserPost.objects.all()
        resource_name = 'userpost'

        #Improper Auth
        authorization = Authorization()

ここに私のモデルがあります:

class UserProfile(models.Model):

    user = models.OneToOneField(User)

    website = models.CharField(max_length=50)
    description = models.CharField(max_length=255)
    full_name = models.CharField(max_length=50)


class UserPost(models.Model):
    user = models.ForeignKey(User)

    datetime = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=255, blank=True)
    location =  models.CharField(max_length=255, blank= True)
4

1 に答える 1

10

Tastypie フィールド (リソースが a の場合) では、 kwargModelResourceを渡すことができます。これにより、通常の django のネストされたルックアップ構文が受け入れられます。attribute

したがって、まずこれが役立つ場合があります。

# in UserProfile model (adding related_name)
user = models.OneToOneField(User, related_name="profile")

上記の変更を考慮すると、次のようになります。

from tastypie import fields

class UserResource(ModelResource):
    # ... 
    website = fields.CharField(attribute = 'profile__website' )
    description = fields.CharField(attribute = 'profile__description' )
    full_name = fields.CharField(attribute = 'profile__full_name' )
    # ...

UserProfile内のモデルからのデータを公開しますUserResource

UserPost内の(からの) ロケーションのリストを公開したい場合は、いずれかのメソッドUserResourceをオーバーライドする必要があります。Tastypieドキュメントによると、良い候補はdehydrate()メソッドです。

このようなものが動作するはずです:

# in UserPost model (adding related_name)
user = models.ForeignKey(User, related_name="posts")

class UserResource(ModelResource):
    # ....
    def dehydrate(self, bundle):
        posts = bundle.obj.posts.all()
        bundle.data['locations'] = [post.location for post in posts]
        return bundle
    # ...
于 2012-09-15T09:22:03.473 に答える