2013-10-15 47 views
0

我有一个像下面这样的模型。tastypie,GET/POST一个模型的字段?

class Checklist(models.Model): 

    name = models.CharField(max_length=50, default="mylist") 
    items = JSONField(default=get_default_checklist) 
    user = models.ForeignKey(User, related_name='checklists') 

对于给定的Checklist.id,我想只有items场,所以我创建了一个资源为它。

class ChecklistItemsResource(ModelResource): 

    def dehydrate_items(self, bundle): 
     return json.dumps(bundle.obj.items, ensure_ascii=False) 

    class Meta: 
     queryset = models.Checklist.objects.all() 
     resource_name = 'checklist_items' 
     fields = ['items'] 

和我得到的数据与URL /api/v1/checklist_items/8/?format=json
ID = 8实际上是清单不是checklist.items ID的ID。

  • 编辑 -

我觉得/api/v1/checklist/8/items/看起来比/api/v1/checklist_items/8/更好。
代表items清单字段(id = 8)。

如何创建资源/ URL来获取/更新模型的特定字段?

+0

预期输出是什么? –

+0

@kroolik:我更新了问题。 – eugene

回答

2

您可以使用prepend_urls钩子为您的Checklist资源创建/items/子资源。以下添加到您的资源:

from django.conf.urls import url 
from tastypie.bundle import Bundle 
from tastypie.utils import trailing_slash 

def prepend_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/(?P<%s>\w[\w/-]*)/items%s$" % (self._meta.resource_name, self._meta.detail_uri_name, trailing_slash()), self.wrap_view('get_items'), name="api_get_items"), 
    ] 

def get_items(self, request, **kwargs): 
    pk = kwargs[self._meta.detail_uri_name] 
    try: 
     checklist = Checklist.objects.get(pk=pk) 
    except Checklist.DoesNotExist: 
     return self.create_response(request, {}, status=404) 

    if request.method == 'GET': 
     bundle = Bundle(request=request, obj=checklist) 
     bundle.data['items'] = self._meta.fields['items'].dehydrate(bundle) 
     if hasattr(self, 'dehydrate_items'): 
      bundle.data['items'] = self.dehydrate_items(bundle) 

     return self.create_response(request, bundle) 
    elif request.method == 'PATCH': 
     data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json')) 
     checklist.items = data 
     checklist.save() 
     return self.create_response(request, {}) 

要更新items场,发送PATCH请求/items/端点与体内新连载新的价值。这种观点可以很容易地扩展到一般情况。

相关问题