Сохранение модели магистрали () с Django Tastypie

Я работаю над некоторым кодом, который опирается на совместную работу 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 вместо идентификатора во время сериализации. Есть ли способ сделать это?


person Luke Sapan    schedule 28.01.2015    source источник


Ответы (1)


Я видимо упустил довольно важную деталь. В reverseRelation я установил includeInJSON на 'id'. Он специально используется для извлечения определенного значения при сериализации.

Это работает, изменяя includeInJSON на 'resource_uri'.

person Luke Sapan    schedule 28.01.2015