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

man*_*uel 1 django tastypie

我在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)
Run Code Online (Sandbox Code Playgroud)

和报价

class Offer(models.Model):
    description = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

这意味着每个用户都可以关注其他用户,并可以使用他们喜欢的优惠创建购物清单.

我可以创建一个查询,以查看优惠是否在我所关注的任何人的购物清单中

profile.follows.filter(shoppinglist=offer)
Run Code Online (Sandbox Code Playgroud)

并返回UserProfile对象的查询集.

现在,我在我的tastypie API中使用了OfferResource和UserProfileResource来代表这两个模型.

我需要做的是,每当我收到一份优惠清单时,都会在每个优惠中添加一个自定义字段,其中包含我所关注的"喜欢"优惠的人员列表.

offer: {
    description: 'Something'
    liked_by: [
        { ... },
        { ... }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以覆盖'dehydrate'方法来添加自定义字段但是如果我添加

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

在likes_by字段中生成的用户列表未被序列化或脱水.

有任何想法吗?

Bla*_*ake 5

您可以通过对OfferResource上的ToManyField的"attribute"参数使用lambda函数来"嵌入"一个包.例如:

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

关于这方面的一些文档.