我正在使用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
,请仅使用text
中showCategories
变量的子类别名称,填充下拉列表所需的时间几乎是瞬间的。这是否意味着除了父类别id之外,最好还有一个包含父类别名称的数据库表(例如列id
,name
,parentid
,{ {1}})?或者有更好的解决方案吗?