我配置了一个简单的API和资源,连接到现有的数据库(这就是我需要在模型上指定表名和列的原因)。我可以正常创建和列出对象。但是当我创建一个时,我从来没有正确获取Location头,也无法返回创建的数据。
创建对象:
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"system_key": "test","system_nam": "test","system_url": "https://test/test"}' http://127.0.0.1:7000/api/system/?ticket=TGT-585-d9f9effb36697401dce5efd7fc5b3de4
响应:
HTTP/1.0 201 CREATED
Date: Thu, 14 Feb 2013 18:58:17 GMT
Server: WSGIServer/0.1 Python/2.7.3
Vary: Accept
Content-Type: text/html; charset=utf-8
Location: http://127.0.0.1:7000/api/system/None/
注意Location标头。看起来对象是成功创建的,但是信息没有从DB返回到API,因此可以在响应中使用它。为了清楚起见,该行在数据库表上是完美的。
如果我添加always_return_data = True
,我会收到:
HTTP/1.0 400 BAD REQUEST
Date: Thu, 14 Feb 2013 19:00:32 GMT
Server: WSGIServer/0.1 Python/2.7.3
Content-Type: application/json
{"error": "The object '<system: MRMteste>' has an empty attribute 'system' and doesn't allow a default or null value."}
我的资源和模型非常简单:
资源:
class SystemResource(ModelResource):
class Meta:
list_allowed_methods = ['get', 'post']
detail_allowed_methods = ['get', 'put','patch']
queryset = system.objects.all()
resource_name = 'system'
authorization = Authorization()
authentication = customAuth.CustomAuthentication()
def hydrate_system_timestamp(self, bundle):
bundle.data['system_timestamp'] = get_now_time()
return bundle
模型:
class system(models.Model):
list_display = ('system_nam')
system = models.IntegerField(primary_key=True, db_column="system_id")
system_nam = models.CharField(max_length=50)
system_key = models.CharField(max_length=255)
system_url = models.CharField(max_length=100)
is_deleted_flg = models.BooleanField()
system_timestamp = models.DateTimeField(default=datetime.now)
def __unicode__(self):
return self.system_nam
class Meta:
db_table = "system"
文档中没有关于此的内容。任何对tastypie有更多经验的人都可以告诉我模型和资源是否正确? 我在这个日期使用最新版本的tastypie和django。
感谢一堆
答案 0 :(得分:1)
您必须在资源的元类中设置:
always_return_data = True
并尝试将您的唯一ID字段设置为默认名称ID而非服务。
答案 1 :(得分:1)
其实我已经解决了这个问题。
在模型上,如果您需要像我一样定义列名,请不要在主键上使用IntegerField。 这样做:
system = models.AutoField(primary_key=True, db_column="system_id")
tastypie管理新创建的对象的方式,它需要在模型上定义的自动增量,因此它知道最后创建的ID。 很好的发现,希望有一天能帮到某人。