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'