使用Django Tastypie的骨干模型save()

时间:2015-01-28 19:34:38

标签: django backbone.js tastypie backbone-relational

我正在研究一些依赖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。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

我显然错过了一个相当重要的细节。在reverseRelation我设置includeInJSON'id'。它特别用于在序列化时提取特定值。

通过将includeInJSON更改为'resource_uri'来实现。