我有一个如下的模型。
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']
我用网址/api/v1/checklist_items/8/?format=json
获取数据
id = 8实际上是核对清单的ID而不是 checklist.items 的ID。
我认为/api/v1/checklist/8/items/
看起来比/api/v1/checklist_items/8/
好
表示清单的items
字段(id = 8)。
如何创建资源/网址以获取/更新模型的特定字段?
答案 0 :(得分:2)
您可以使用prepend_urls
挂钩为/items/
资源创建Checklist
子资源。将以下内容添加到您的资源中:
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/
请求,并在正文中添加新的序列化新值。对于一般情况,可以轻松扩展此视图。