Django REST API& Backbone:访问自引用模型

时间:2016-01-29 18:22:21

标签: backbone.js django-models django-rest-framework self-reference

我正在使用Django REST API将数据从Postgres数据库提供给Backbone。我的一个Backbone集合处理自引用类别模型 - 类别可以是父类别或子子类别。在应用程序的各个页面上,我想显示一个带有category-subcategory对的下拉列表(或者只是类别,如果parent没有子子类别);大约有500对这样的对(见下文)。问题是使用fetch()或getJSON()从API访问类别数据的速度非常慢,以至于下拉列表需要20-25秒才能填充。如何减少延迟?类别表的数据库架构是否应该不同? django类型应该是不同的吗?串行器应该不同吗?我应该以不同的方式将数据提供给前端吗?

以下是我目前的设计选择。

数据库类别表:

id
name
parentid

Django分类模型:

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField()
    parentid = models.ForeignKey('self')

Serializer(对于每个类别,父ID将显示为null或显示完整的父类别):

class CategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = ('id', 'name', 'parentid')
    depth = 2

骨干视图:

initialize: function() {
...
    var self = this;
    var promise = $.getJSON('/api/categories.json', function(data) {
        self.categoriesArray = data;
    });
    promise.done(function() {
        console.log('categories available');
        self.showCategories(self.categoriesArray);
    });
...
},

ui: {
    categoriesDropdown: "#categories-tags"
},

showCategories: function(categories) {
    var self = this;
    var text, value;
    _.each(categories, function(item) {
        if (item['parentid']) {
            text = item['parentid']['name'] + "-" + item['name'];
        } else {
            text = item['name'];
        }
        value = item['id'];

        self.ui.categoriesDropdown
            .append($("<option></option>")
            .attr("value", value)
            .text(text));               
    });
},

我正在处理大约450个类别,其中只有100个是父类别。如果我完全删除了父类别的复杂性(从序列化程序中删除depth = 2,请仅使用textshowCategories变量的子类别名称,填充下拉列表所需的时间几乎是瞬间的。这是否意味着除了父类别id之外,最好还有一个包含父类别名称的数据库表(例如列idnameparentid,{ {1}})?或者有更好的解决方案吗?

0 个答案:

没有答案