我正在使用TastyPie来创建REST客户端/服务器,以访问有关我们的系统级构建后测试的一些数据。我希望客户能够忽略 product 在内部存储为外键的事实,并使用产品和标签名称进行CRUD操作。本质上,我希望客户端脚本与“product”和“tag”作为CharFields进行交互,但是要将此信息作为外键保存在服务器上。这是我的api.py:
from tastypie import fields
from tastypie.resources import ModelResource
from models import Test, Product, Tag
class ProductResource(ModelResource):
name = fields.CharField('name', unique=True)
class Meta:
queryset = Product.objects.all()
filtering = {'iexact', 'exact'}
class TagResource(ModelResource):
name = fields.CharField('name', unique=True)
class Meta:
queryset = Tag.objects.all()
filtering = {'iexact', 'exact'}
class TestResource(ModelResource):
product = fields.ForeignKey(ProductResource, 'product', full=True)
tags = fields.ForeignKey(TagResource, 'tags', full=True)
command = fields.CharField('command')
class Meta:
queryset = Test.objects.all()
filtering = {'product': tastypie.constants.ALL_WITH_RELATIONS,
'tag': tastypie.constants.ALL_WITH_RELATIONS}
我目前正在开发一个定制的ApiField类,它可以使用自己的水合物和脱水来做到这一点,但这让我觉得我可能会遗漏一些东西。我怎样才能让客户做到,例如:
curl -H "Content-Type: application/json" -X POST --data '{"product": "fisherman", "command": "go fish"}' /api/v1/test/
答案 0 :(得分:0)
您可以添加新网址来处理命令:
class TestResource(ModelResource):
...
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/commands$" % self._meta.resource_name, self.wrap_view('handle_commands'), name="api_handle_commands"),
]
def handle_commands(self, request):
command = request.POST['command']
product = Product.objects.get(name=request.POST['product'])
# do your stuff