刚刚介绍了django tastypie并且无法发送数据。我有一个django模型,
class OrderItem(SmartModel):
shopping_id = models.CharField(max_length=255,db_index=True)
quantity = models.IntegerField()
item = models.ForeignKey(Item)
option = models.ForeignKey(OptionalItem,null=True,blank=True)
toppings_and_extras = models.ManyToManyField(ToppingsAndExtra,null=True, blank=True)
和tastypie资源,
class OrderItemResource(ModelResource):
item = fields.ToOneField(ItemResource,'item',null=False,blank=False,full=True)
option = fields.ToOneField(OptionResource,'option',null=True,blank=True,full=True)
toppings_and_extras = fields.ToManyField(ToppingResource,'toppings_and_extras',null=True,blank=True,full=True)
class Meta:
queryset = OrderItem.objects.all()
resource_name = 'order'
authorization = Authorization()
always_return_data =True
我按照tastypie docs
中的说明执行测试POST
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"shopping_id":"(TBH5@Y4NQDD$PJWUCQ4WEG3%CL0RSDPUD%EDQ!EG$81^WXSV6^URBC0OO45OC(IV)QW7WC(W0GD9)N&5HXLA1)8M1IHGWQ4A&P1","quantity":"5","item":"/api/v1/menu_item/1/","option":"/api/v1/options/1/","created_by":"/api/v1/user/1/","modified_by_id":"/api/v1/user/1/","toppings_and_extra":"[]"}' http://localhost:8000/api/v1/order/
请求以“当前事务中止”错误响应,查看日志,错误为null value in column "created_by_id" violates not-null constraint
。这是我不明白的,因为我想通过添加"created_by":"/api/v1/user/1/"
来解决问题。我做得不对,我的研究是有限的,因为我似乎无法理解出了什么问题。我们也非常感谢您在文档中提供有用信息的链接。
答案 0 :(得分:0)
要访问任何关系字段,您必须在ModelResource中定义它。
class OrderItemResource(ModelResource):
created_by = fields.ToOneField(UserResource,'created_by')
[...]
class Meta:
queryset = OrderItem.objects.all()
resource_name = 'order'
authorization = Authorization()
always_return_data =True
你必须这样做的原因是Tastypie必须知道该模型的ModelResource定义:资源名称,查询集和授权访问等。没有它,Tastypie会忽略它。
如果您尚未定义UserResource,则应该这样做。
我发现你正在为所有型号使用基础模型:" SmartModel"。我认为最适合你的是继承基础模型资源的创建。 " SmartModelResource"你将在那里定义所需的字段。
class SmartModelResource(ModelResource):
created_by = fields.ToOneField(UserResource,'created_by')
[...]
class OrderItemResource(SmartModelResource):
[...]
class Meta:
queryset = OrderItem.objects.all()
resource_name = 'order'
authorization = Authorization()
always_return_data =True