2013-08-27 22 views
1

我有一些Tastypie资源,我正在脱水,所以我可以返回结果中的资源'slugs(名称),但我无法重新补充它们。如何在Tastypie中水合ToOneField和ToManyField

我试过设置,例如,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)) 

回答

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())