Django tastypie,获取/发布模型的字段?

Django tastypie,获取/发布模型的字段?,django,tastypie,Django,Tastypie,我有一个像下面这样的模型 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,我只想获取项字段,因

我有一个像下面这样的模型

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,我只想获取
字段,因此我为它创建了一个资源

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\u items/8/?format=json获取数据
id=8实际上是检查表的id而不是检查表的id。项目的id

  • 编辑-
我认为
/api/v1/checklist/8/items/
看起来比
/api/v1/checklist\u items/8/
要好
表示检查表中的
项目
字段(id=8)


如何创建resource/url来获取/更新模型的特定字段?

您可以使用
prepend\u url
钩子为
清单
资源创建
/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, {})
从django.conf.url导入url
从tastypie.bundle导入bundle
从tastypie.utils导入尾部斜杠
def prepend_URL(自身):
返回[
url(r“^(?P%s)/(?P\w[\w/-]*)/items%s$”%(self.\u meta.resource\u name,self.\u meta.detail\u uri\u name,trailing\u slash()),self.wrap\u view('get\u items'),name=“api\u get\u items”),
]
def get_项目(自我、请求、**kwargs):
pk=kwargs[self.\u meta.detail\u uri\u name]
尝试:
检查表=检查表.objects.get(pk=pk)
除检查表外。DoesNotExist:
返回self.create_响应(请求,{},状态=404)
如果request.method==“GET”:
捆绑=捆绑(请求=请求,obj=检查表)
bundle.data['items']=self.\u元字段['items'].脱水(bundle)
如果hasattr(自我,“脱水物品”):
bundle.data['items']=自脱水项(bundle)
返回self.create\u响应(请求、捆绑)
elif request.method=='PATCH':
data=self.deserialize(request,request.body,format=request.META.get('CONTENT\u TYPE','application/json'))
检查表项目=数据
检查表保存()
返回self.create_响应(请求,{})

要更新
项目
字段,请向
/items/
端点发送一个
补丁
请求,并在正文中添加新的序列化新值。这个观点可以很容易地扩展到一般情况。

预期的结果是什么?@kroolik:我更新了这个问题。