0

以下のようなモデルがあります。

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

items特定の 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_items/8/?format=json
id=8 のデータは、実際にはchecklist.itemsのID ではなく、チェックリストの ID です。

  • 編集 -

/api/v1/checklist/8/items/より見栄えが良いと思います/api/v1/checklist_items/8/
チェックリストのフィールドを表すitems(id=8)。

モデルの特定のフィールドを取得/更新するためのリソース/URL をどのように作成しますか?

4

1 に答える 1

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/このビューは、一般的なケースに簡単に拡張できます。

于 2013-10-19T12:51:33.800 に答える