-
Добрый день!
Никак не могу спроектировать модели для хранения таблицы:
Изначально была создана модель для строки данных a1,a2,b1,b2
Поля в таблице заполняются попарно (или a1 и a2 не пусто, или b1 и b2 не пусто, или a1,a2,b1,b2 не пусто). Кажется логичным разбить эту модель на две, для того чтобы избежать множества полупустых строк:class MyModel(models.Model):
a1 = models.TextField(blank=True)
a2 = models.ForeignKey('somemodel1',blank=True)
b1 = models.TextField(blank=True)
b2 = models.ForeignKey('somemodel2',blank=True)
Однако хочется не потерять удобность отображения и фильтрации, например с помощью наследования:class MyModel_1(models.Model):
a1 = models.TextField(blank=True)
a2 = models.ForeignKey('somemodel1',blank=True)
class MyModel_2(models.Model):
b1 = models.TextField(blank=True)
b2 = models.ForeignKey('somemodel2',blank=True)
В этом случае Django автоматом создает OneToOneFields на родителей и при сохранении автоматом создает экземпляры и MyModel_1 и MyModel_2, что приводит к множеству пустых строк.class MyModels_View(MyModel_1,MyModel_2):
pass
Каким образом спроектировать модели, чтобы было удобно и быстро?
Идеальным для меня вариантом была бы конструкция
Что позволило бы легко отобразить таблицу со всеми полями a1,a2,b1,b2 по ключам m1,m2..., а так же фильтровать какclass MyModels_View(MyModel_1,MyModel_2):
m1=models.ForeignKey('MyModel_1',blank=True)
m2=models.ForeignKey('MyModel_2',blank=True)
class Meta:
proxy=True
Несколько дней уже бьюсь не могу найти решение.MyModels_View.objects.filter(a2__id__in=ids).filter.(b1__contains=someword) -
Жду комментариев и предложений. С удовольствием уточню если что плохо объяснил.
-
Где именно нужно отображать и фильтровать данные?
-
Данные отображаются в виде таблицы с помощью ExtJS (Ext.grid.GridPanel). Фильтры, это фильтры к этой таблице(Ext.ux.grid.GridFilters)
-
Код таблицы:
Данные передаются в JSON с помощью extdirect.django. Код на сервере примерно такой:var store = new Ext.data.DirectStore({
remoteSort : true,
autoLoad : true,
api : {
read : db.MyModels_View.read
},
reader : new Ext.data.JsonReader()
})
var columns = Ext.grid.ColumnModel({
columns : [{
dataIndex : 'a1'
}, {
dataIndex : 'a2'
}, {
dataIndex : 'b1'
}, {
dataIndex : 'b2'
}]
})
var filters = Ext.ux.grid.GridFilters({
filters : [{
type : 'string',
dataIndex : 'a1'
}, {
type : 'list',
valueField : 'id',
labelField : 'label',
dataIndex : 'a2',
store : Ext.StoreMgr.lookup('somemodel1_store')
}, {
type : 'string',
dataIndex : 'b1'
}, {
type : 'list',
valueField : 'id',
labelField : 'label',
dataIndex : 'b2',
store : Ext.StoreMgr.lookup('somemodel2_store')
}]
})
var table = new Ext.grid.GridPanel({
store : store,
plugins : filters,
colModel : colomns
});from extdirect.django import ExtDirectCRUD,ExtRemotingProvider
provider = ExtRemotingProvider(namespace='db', url='/remoting/router/')
class MyModels_View_CRUD(ExtDirectCRUD):
model = MyModels_View
MyModels_View_CRUD(provider, 'MyModels_View', False, False)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

