1

我在 django 中有一个稍微复杂的模型结构,其中包括一个 UserProfile

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 对象的查询集。

现在,我的美味派 API 中有代表这两个模型的 OfferResource 和 UserProfileResource。

我需要做的是,每当我获得优惠列表时,为每个优惠添加一个自定义字段,其中包含我关注的“喜欢”该优惠的人员列表。

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 的“属性”参数使用 lambda 函数来“嵌入”包。例如:

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]

也可以为attributekwarg 提供一个可调用对象,但不清楚您需要什么才能查找您的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

对我来说,您可能需要阅读美味的文档并弄清楚您需要扩展什么。因为我的猜测是你需要在那里扩展一些东西。不在模型中,而是在美味派(序列化程序,字段)中。IT 很难回答,因为您的意图仍然不是 100% 清楚。

此外,由于您似乎想要聚合更多模型,请查看此链接是否对您有帮助:

于 2012-11-13T17:18:19.223 回答