我正在研究一些依赖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提供错误请求错误,因为当Backbone序列化fruit
对象以进行发送时,它会将其basket
属性设置为数字(篮子的ID)。
Tastypie的完整回应是:
{“error”:“'basket'字段的数据不是URI,不是 字典相似且没有'pk'属性:1。“}
我不想在保存模型之前手动将basket属性设置为具有PK字段的对象或数据URI。这无法实现无缝工作。有没有办法告诉Tastypie,当它收到一个号码时,它是篮子的ID?
编辑:在序列化期间调整Backbone的逻辑以使用resource_uri而不是id可能更合理,而不是让Tastypie接受原始ID。有没有办法做到这一点?
答案 0 :(得分:1)
我显然错过了一个相当重要的细节。在reverseRelation
我设置includeInJSON
到'id'
。它特别用于在序列化时提取特定值。
通过将includeInJSON
更改为'resource_uri'
来实现。