1

UserProfile を含む少し複雑なモデル構造が django にあります。

class UserProfile(models.Model):
    shoppinglist = models.ManyToManyField(Offer)
    user         = models.OneToOneField(User)
    follows = models.ManyToManyField('self', related_name='followers', symmetrical=False, blank=True)

とオファー

class Offer(models.Model):
    description = models.CharField(max_length=200)

これが意味することは、各ユーザーが他のユーザーをフォローして、好きなオファーで買い物リストを作成できるということです。

このように、フォローしている人の買い物リストにオファーがあるかどうかを確認するクエリを作成できます

profile.follows.filter(shoppinglist=offer)

UserProfile オブジェクトのクエリセットを返します。

今、私はこの 2 つのモデルを表す OfferResource と UserProfileResource を Tastypie API に持っています。

私がする必要があるのは、オファーのリストを取得するたびに、そのオファーの「いいね」をフォローしている人のリストを含むカスタム フィールドを各オファーに追加することです。

offer: {
    description: 'Something'
    liked_by: [
        { ... },
        { ... }
    ]
}

「脱水」メソッドをオーバーライドしてカスタムフィールドを追加できることは知っていますが、追加すると

def dehydrate(self, bundle):
    bundle.data['liked_by'] = profile.follows.filter(shoppinglist=bundle.obj)

like_by フィールドの結果のユーザーのリストは、シリアル化または脱水されません。

何か案は?

4

3 に答える 3

5

OfferResource の ToManyField の「属性」引数にラムダ関数を使用して、バンドルを「埋め込む」ことができます。例えば:

liked_by = fields.ToManyField(
    UserProfileResource,
    attribute=lambda bundle: bundle.request.user.get_profile().follows.filter(
        shoppinglist=bundle.obj),
    full=True,
    null=True)

それに関する少しのドキュメント。

于 2012-11-13T20:06:16.177 に答える
2

UserProfileResource を使用して、オブジェクトのリストを脱水できます。

class OfferResource(ModelResource):

    ...
    users = fields.ToManyField(UserProfileResource, attribute='users', full=True)

    ...
    def dehydrate_users(self, bundle):
        res = UserProfileResource()
        objects = profile.follows.filter(shoppinglist=bundle.obj)
        bundles = [res.build_bundle(obj=obj, request=bundle.request) for obj in objects]
        return [res.full_dehydrate(bundle) for bundle in bundles]

kwarg にcallable を提供することも可能ですが、オブジェクトattributeを検索できるようにするために何が必要かは明確ではありませんprofile。そのスコープ内で取得できる場合は、クエリセットを返すだけです。

class OfferResource(ModelResource):

    ...
    users = fields.ToManyField(UserProfileResource, 
        attribute=lambda bundle: get_profile(bundle.request).follows.filter(shoppinglist=bundle.obj),
        full=True)
于 2012-11-13T20:07:47.400 に答える
0

私には、おそらくtastypieのドキュメントを読んで、拡張する必要があるものを理解する必要があるようです. 私の推測では、そこに何かを拡張する必要があるからです。モデルではなく、tastypie (シリアライザー、フィールド) で。あなたの意図がまだ 100% 明確ではないため、IT 部門が回答するのは困難です。

また、より多くのモデルを集約したいと思われるため、このリンクが役立つかどうかを確認してください。

于 2012-11-13T17:18:19.223 に答える