Backbone 使用 Django Tastypie 模型保存()
Backbone model save() with Django Tastypie
我正在编写一些依赖于 Backbone、Backbone-relational 和 Tastypie 协同工作的代码。 (如果重要的话,我已经包含了 backbone-tastypie 库)。
我有一个 Basket
模型,它存储一些关于自身的属性,并且可以有许多 Fruit
个模型:
var Fruit = Backbone.RelationalModel.extend({
urlRoot: '/api/v1/fruit/',
});
var Basket = Backbone.RelationalModel.extend({
urlRoot: '/api/v1/basket/',
relations: [{
type: Backbone.HasMany,
key: 'fruit',
relatedModel: Fruit,
reverseRelation: {
key: 'basket',
includeInJSON: 'id',
}
}],
});
var BasketCollection = Backbone.Collection.extend({
model: Basket,
});
我首先加载我所有的篮子:
var baskets = new BasketCollection();
baskets.fetch();
效果很好,因为我已将 Tastypie 配置为自动将水果和篮子一起包含在内。资源如下所示:
class BasketResource(ModelResource):
fruit = fields.ToManyField('my.api.resources.FruitResource', 'fruit', full=True)
class Meta:
queryset = Basket.objects.all()
class FruitResource(ModelResource):
basket = fields.ForeignKey(BasketResource, 'basket')
class Meta:
queryset = Fruit.objects.all()
试图保存水果时出现问题。比方说 fruit
代表一个已经存在的水果被提取。
fruit.set('eaten', true);
fruit.save();
Tastypie 给出一个 Bad Request 错误,因为当 Backbone 序列化 fruit
对象用于发送时,它将其 basket
属性 设置为一个数字(ID篮子)。
Tastypie 的完整回复是:
{"error": "The 'basket' field was given data that was not a URI, not a
dictionary-alike and does not have a 'pk' attribute: 1."}
我不想在保存模型之前手动将购物篮 属性 设置为具有 PK 字段或数据 URI 的对象。这违背了它无缝工作的意义。有没有办法告诉 Tastypie 当它收到一个数字时,它就是篮子的 ID?
编辑:与其让 Tastypie 接受原始 ID,不如调整 Backbone 的逻辑以使用 resource_uri 而不是更合理序列化时的id。有办法吗?
我显然错过了一个相当重要的细节。在 reverseRelation
中,我将 includeInJSON
设置为 'id'
。专门用来在序列化的时候拉一个特定的值。
它的工作原理是将 includeInJSON
更改为 'resource_uri'
。
我正在编写一些依赖于 Backbone、Backbone-relational 和 Tastypie 协同工作的代码。 (如果重要的话,我已经包含了 backbone-tastypie 库)。
我有一个 Basket
模型,它存储一些关于自身的属性,并且可以有许多 Fruit
个模型:
var Fruit = Backbone.RelationalModel.extend({
urlRoot: '/api/v1/fruit/',
});
var Basket = Backbone.RelationalModel.extend({
urlRoot: '/api/v1/basket/',
relations: [{
type: Backbone.HasMany,
key: 'fruit',
relatedModel: Fruit,
reverseRelation: {
key: 'basket',
includeInJSON: 'id',
}
}],
});
var BasketCollection = Backbone.Collection.extend({
model: Basket,
});
我首先加载我所有的篮子:
var baskets = new BasketCollection();
baskets.fetch();
效果很好,因为我已将 Tastypie 配置为自动将水果和篮子一起包含在内。资源如下所示:
class BasketResource(ModelResource):
fruit = fields.ToManyField('my.api.resources.FruitResource', 'fruit', full=True)
class Meta:
queryset = Basket.objects.all()
class FruitResource(ModelResource):
basket = fields.ForeignKey(BasketResource, 'basket')
class Meta:
queryset = Fruit.objects.all()
试图保存水果时出现问题。比方说 fruit
代表一个已经存在的水果被提取。
fruit.set('eaten', true);
fruit.save();
Tastypie 给出一个 Bad Request 错误,因为当 Backbone 序列化 fruit
对象用于发送时,它将其 basket
属性 设置为一个数字(ID篮子)。
Tastypie 的完整回复是:
{"error": "The 'basket' field was given data that was not a URI, not a dictionary-alike and does not have a 'pk' attribute: 1."}
我不想在保存模型之前手动将购物篮 属性 设置为具有 PK 字段或数据 URI 的对象。这违背了它无缝工作的意义。有没有办法告诉 Tastypie 当它收到一个数字时,它就是篮子的 ID?
编辑:与其让 Tastypie 接受原始 ID,不如调整 Backbone 的逻辑以使用 resource_uri 而不是更合理序列化时的id。有办法吗?
我显然错过了一个相当重要的细节。在 reverseRelation
中,我将 includeInJSON
设置为 'id'
。专门用来在序列化的时候拉一个特定的值。
它的工作原理是将 includeInJSON
更改为 'resource_uri'
。