我在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字段中生成的用户列表未被序列化或脱水.
有任何想法吗?
您可以通过对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)
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |