如何在 tastypie 中创建自定义嵌套的 ToMany 资源



我在 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)

并返回用户配置文件对象的查询集。

现在,我在我的 tastypie API 中有 OfferResource 和一个 UserProfileResource 代表这两个模型。

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

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

我知道我可以覆盖"脱水"方法来添加自定义字段,但如果我添加

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

liked_by字段中生成的用户列表未序列化或冻结。

有什么想法吗?

您可以通过在 OfferResource 上使用 Lambda 函数作为 ToManyField 的"属性"参数来"嵌入"捆绑包。例如:

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

关于这一点的一些文档。

您可以使用 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]

也可以为 attribute kwarg 提供一个可调用对象,但不清楚查找profile对象所需的全部内容。 如果可以在该范围内获取它,则只需返回一个查询集:

class OfferResource(ModelResource):
    ...
    users = fields.ToManyField(UserProfileResource, 
        attribute=lambda bundle: get_profile(bundle.request).follows.filter(shoppinglist=bundle.obj),
        full=True)

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

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

最新更新