2013-03-26 43 views
2

我正在使用django tastypie将具有相关(ToOne)字段的模型发布到其他模型资源。 URI是: /api/map/?format=jsondjango tastypie:如何通过url参数控制相关字段“丰满度”?

我希望让客户包括full_pages URL参数,以获得完整的相关页面资源:/api/map/?full_pages=1&format=json

我真的不明白Relationship Fields docs,但我做了一个get_full赎回:

def get_full(bundle): 
    if bundle.request.GET.get('full_pages', 0): 
     return True 
    return False 

我试图传递调用到full说法ToOneField

from tastypie.contrib.gis import resources as gis_resources 

class MapResource(gis_resources.ModelResource): 
    page = fields.ToOneField('pages.api.PageResource', 'page', full=get_full) 

但是,当我检查pdb时,get_full永远不会被调用。

于是我试着用full属性创建一个自定义FillableToOneField

class FillableToOneField(fields.ToOneFIeld): 
    full = get_full 

class MapResource(ModelResource): 
    page = FillableToOneField('pages.api.PageResource', 'page') 

再次,则永远不会调用get_full

有没有更好,更简单的方法来做到这一点?

回答

0

您可以简单地在dehydrate方法下实现此操作,如下所示。

class MapResource(ModelResource): 
    page = fields.ToOneField('pages.api.PageResource', 'page') 

    def dehydrate(self, bundle): 
     if bundle.request.Get.get('full_pages'): 
      self.page.full = True 
     return bundle 

并将它们发送一个请求为/api/map/?full_pages=True&format=json

+0

似乎并不奏效 - GET参数对页面完整属性没有影响。 :( – groovecoder 2013-03-26 13:27:40

+0

@groovecoder我在发布之前测试过这个,你是否有任何错误? – Amyth 2013-03-26 13:33:45

+0

没有错误;我实际上扩展了tastypie.contrib.gis.resources.ModelResource,如果这有所作为?它看起来像“丰满”的相关字段是在脱水之前确定的? – groovecoder 2013-03-26 14:03:57

0

阅读Amyth's answerdjango-boundaryservice code后,我得到这个由违约全额True并改变它在dehydrate方法上相关 PageResource工作:

class MapResource(gis_resources.ModelResource): 
    page = fields.ToOneField('pages.api.PageResource', 'page', full=True) 

pages.api:

class PageResource(ModelResource): 
    ... 

    def dehydrate(self, bundle): 
     if not bundle.request.GET.get('full_pages'): 
      bundle = bundle.data['resource_uri'] 
     return bundle 
+1

是的,但是防止'full'的部分目的是为了限制数据库查询的速度,如果使用这种方法,我相信'full' *数据库查询*仍然会被执行。正确的数据将被返回*,但Tastypie仍将完成所有工作以获取相关对象(这需要时间),然后这些对象将从数据中移除。 – cloudrave 2014-11-08 00:07:49

相关问题