我想使用tastypie创建一个视图来暴露相同类型的某些对象,但是有以下两个三个曲折:
我不清楚如何进入tastypie生命周期来实现这一目标.添加"虚拟"字段的推荐方法是在脱水方法中,该方法只知道它正在操作的包.
更糟糕的是,没有正式的方法来加入查询集.
如果我能让tastypie接受查询集以外的东西,我的问题就会消失.在这种情况下,我可以传递一个我的对象的子类列表,并添加了附加字段.
我愿意接受任何其他明智的解决方案.
编辑:添加了扭曲3 - 每用户数据.
我想在GET响应中包含一些字段,并在POST确认响应中包含一小部分字段.我必须在alter_detail_data_to_serialize中有很多del bundle ['field1'],del bundle ['field2']来实现这一点.有没有通用的方法我可以在我的资源中指定字段并排除每个请求类型?
我发送一个创建新用户的POST,这是有效的.
我的问题是我如何回到例如创建用户的pk到ajax响应?
$.ajax({
url: 'http://localhost:8080/api/v1/create/user/',
type: 'POST',
contentType: 'application/json',
data: '{"uuid": "12345"}',
dataType: 'json',
processData: false,
success: function (r) {
console.log(r)
},
});
def obj_create(self, bundle, request=None, **kwargs):
try:
user = User.objects.create_user(bundle.data['uuid'],'1')
user.save()
except:
pass
return bundle
Run Code Online (Sandbox Code Playgroud) 我的问题是Backbone正试图在URL上用斜杠做一个HTTP请求,如下所示:
:8000/api/v1/update/2/
Run Code Online (Sandbox Code Playgroud)
出于某种原因,Django(或tastypie)最终不接受带有斜杠的URL,因此上述URL不起作用,但此URL确实有效:
:8000/api/v1/update/2
Run Code Online (Sandbox Code Playgroud)
Backbone-tastypie回退到oldSync,这是Backbone附带的原始同步,当不使用其重写的同步时.我相信当Backbone-tastypie使用oldSync时,它会在URL的末尾添加一个斜杠,这是我不想要的.
建议的大多数解决方案都是处理我遇到的相反问题.他们正在尝试修复尾部斜杠工作的问题,但没有尾部斜杠不起作用.
除了非尾部斜杠之外,我还需要能够支持尾部斜杠.这可以通过两种方式解决:
如何更改骨干 - tastypie代码,以便没有AJAX调用在末尾附加斜杠?
如何使Django/tastypie将上述两个URL视为相同?
其中任何一个都可以解决我的问题,但我无法弄清楚如何实现它们中的任何一个.
对,我很难理解这一个,
在我的本地环境中,我为django User对象集成了用户名查找:
class UserResource(ModelResource):
class Meta:
queryset = User.objects.all()
excludes = ['password', 'email', 'is_staff', 'is_active', 'is_superuser']
resource_name = 'users'
include_resource_uri = False
filtering = {
'username': ALL
}
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/(?P<username>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
]
Run Code Online (Sandbox Code Playgroud)
在tastypie的源代码中,resources.py我在1800+行添加了两个打印语句
def obj_get(self, request=None, **kwargs):
"""
A ORM-specific implementation of ``obj_get``.
Takes optional ``kwargs``, which are used to narrow the query to find
the instance.
"""
try:
print "1, ", kwargs
base_object_list = self.get_object_list(request).filter(**kwargs)
print "2, ", base_object_list
# etcetera
Run Code Online (Sandbox Code Playgroud)
游览: …
我正在对我的Tastypie api做一个POST请求,它创建了一个资源.它通常通过响应中的Location标头返回资源uri.我遇到的问题是Location头包含一个非ssl url,即使我的初始请求(以及我的整个应用程序)都在https下.
从我的请求标题:
URL: https://example.com/api/v1/resource/
Run Code Online (Sandbox Code Playgroud)
从我的回复标题:
Location: http://example.com/api/v1/resource/80/
Run Code Online (Sandbox Code Playgroud)
因为这是一个并不总是在ssl下运行的可重用应用程序,所以我不想硬编码一个丑陋的字符串替换.此外,已经有一个301重定向,从http到https,但我不希望重定向发生.
所有帮助赞赏!
更新: 这实际上与Tastypie没有任何关系,这是因为服务器/代理配置.有关解决方案的详细信
假设我想得到关于某个地方的评论.我想提出这个要求:
/地/ {} PLACE_ID /评论
我怎么能用TastyPie做到这一点?
我正在尝试POST一个基本上由子资源列表组成的资源.这是我的资源:
class MovementResource(ModelResource):
transactions = fields.ToManyField('stock.api.TransactionResource',
'transaction_set', related_name='movement', full=True)
class Meta:
queryset = Movement.objects.all()
resource_name = 'movement'
always_return_data = True
authorization = Authorization()
class TransactionResource(ModelResource):
movement = fields.ToOneField(MovementResource, 'movement')
product = fields.ToOneField(ProductResource, 'product', full=True)
class Meta:
queryset = Transaction.objects.all()
resource_name = 'transaction'
authorization = Authorization()
Run Code Online (Sandbox Code Playgroud)
这代表了库存中各种产品的移动.移动表单只是一个内联列表,每个事务一个.它根本不使用django表格.
我的问题是,当尝试POST一个指定要创建的事务列表的移动时,我发现Tastypie正在更新现有事务而不是插入新事务.这是POST请求的JSON,表示只有一个事务的移动:
{
'transactions': [
{
'product': '/api/v1/product/3/',
'quantity': '1'
}
]
}
Run Code Online (Sandbox Code Playgroud)
响应JSON显示已创建运动,但事务具有以前存在的ID,并且具有相同的产品和数量.此事务对象中的移动FK已更新为指向新创建的移动.回复数据:
{
'date': '2013-02-07 ···',
'id': '66',
'resource_uri': '/api/v1/movement/66/',
'transactions': [
{
'date': '2013-01-30 ···', # Should be the same as parent …Run Code Online (Sandbox Code Playgroud) 我正在为我的应用程序构建一个REST API,它使用Tastypie使用NoSQL db(Neo4j).
所以我覆盖了类的一些主要方法tastypie.resources.Resource,并且目前正在努力实现def obj_get_list(self, request=None, **kwargs):应该返回对象列表.
实际上,我想通过url(类似的东西http://127.0.0.1:8000/api/airport/?query='aQuery')将参数传递给此方法,然后根据此参数执行查询.
问题是请求是None这样我无法得到它的参数!
打印kwargs变量时,我看到:
{'bundle': <Bundle for obj: '<testNeo4Django.testapp.api.Airport object at 0x9d829ac>' and with data: '{}'>}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
我有一个带有由Tastypie提供的RESTFull服务的Django应用程序.我使用easy_install来安装lxml和defusedxml,所以我可以使用xml而不是json.如果我运行manage.py runserver,它一切正常,但是如果我在同一台机器上通过apache和mod_wsgi运行它,我会从Django说出一个错误配置的错误
Usage of the xml aspects requires lxml and defusedxml
Run Code Online (Sandbox Code Playgroud)
我猜它一定是一个路径问题,但我似乎无法找到任何指向正确方向的东西.有任何想法吗?
tastypie ×10
django ×9
python ×5
rest ×2
ajax ×1
backbone.js ×1
javascript ×1
mod-wsgi ×1
nosql ×1
ssl ×1