如何在tastypie中水合ToOneField和ToManyField

时间:2013-08-27 21:22:21

标签: django tastypie

我有一些tastypie资源,而且我正在脱水,所以我可以在结果中返回资源'slugs(名字),但我无法为它们补充水分。

我尝试过设置,例如bundle.data['profile'] = { 'name': bundle.data['profile'] },但我无法让它工作,看起来它需要所有数据才能构建对象,而不仅仅是某些字段

在此示例中,hydrate_profile有效,但依赖于bundle.obj.profile已加载。我不确定我是否总是可以这么认为。

dehydrate_roles的情况下,我不知道应该返回什么,返回模型列表或者QuerySet不起作用,看起来正确的事情(在两种方法中)都会在两种情况下都要返回正确的资源uri,但我不知道如何在没有太多硬编码的情况下构建它:我需要从字段(或至少从Resource类)中检索原始的Model类,为了获得对象,为了获得它的PK然后构建uri ..听起来对我来说太过分了。

所以:我该怎么办?我的hydrate_profile实施是正确的,还是会把我咬在屁股上?我应该在hydrate_roles中返回什么?

class MinionResource(ModelResource):
    """
    Resource for :models:`inventory.minions.models.Minion`
    """
    roles = fields.ToManyField(RoleResource, 'roles')
    profile = fields.ForeignKey(clouds_api.CloudProfileResource, 'profile')

    class Meta:
        queryset = models.Minion.objects.all()
        resource_name = 'minion/minion'
        filtering = {
            'id': ALL,
            'name': ALL,
            'roles': ALL_WITH_RELATIONS,
            'profile': ALL_WITH_RELATIONS,
        }

    def dehydrate_profile(self, bundle):
        return bundle.obj.profile.name
    def hydrate_profile(self, bundle):
        bundle.data['profile'] = bundle.obj.profile
        return bundle

    def dehydrate_roles(self, bundle):
        return list(bundle.obj.roles.all().values_list('name', flat=True))

1 个答案:

答案 0 :(得分:2)

我无法准确回答什么是正确的,但据我所知,在配置文件部分,当您创建尚未链接配置文件的新对象时,您将遇到问题。

但是,我经常做的只是定义我是否需要信息。

class MinionResource(ModelResource):
    roles = fields.ToManyField(RoleResource, 'roles', full=True)
    profile = fields.ForeignKey(clouds_api.CloudProfileResource, 'profile', full=True)

这已经足够了。但是,如果你不喜欢这样,你可以这样做。

class MinionResource(ModelResource):
    roles = fields.ListField()
    profile = fields.ForeignKey(clouds_api.CloudProfileResource, 'profile', full=True)

    def dehydrate_roles(self, bundle):
        return map(str, bundle.obj.roles.all())