Я работаю над некоторым кодом, который опирается на совместную работу Backbone, Backbone-relational и Tastypie. (Если это имеет значение, я включил библиотеку backbone-tastypie).
У меня есть модель Basket
, которая хранит некоторые свойства о себе и может иметь модели HaveMany 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
число (идентификатор корзины).
Полный ответ от Tastypie:
{"error": "Полю 'корзина' были переданы данные, которые не были URI, не похожи на словарь и не имеют атрибута 'pk': 1."}
Я не хочу вручную устанавливать свойство корзины для объекта с полем PK или URI данных перед сохранением моделей. Это побеждает смысл его бесперебойной работы. Есть ли способ сообщить Tastypie, что когда он получает номер, это идентификатор корзины?
Изменить: вместо того, чтобы заставить Tastypie принимать необработанные идентификаторы, может быть более разумным настроить логику Backbone, чтобы использовать resource_uri вместо идентификатора во время сериализации. Есть ли способ сделать это?