无法理解为什么django tastypie POST因500内部错误而失败

时间:2014-03-27 13:20:21

标签: django tastypie

刚刚介绍了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/"来解决问题。我做得不对,我的研究是有限的,因为我似乎无法理解出了什么问题。我们也非常感谢您在文档中提供有用信息的链接。

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