1. galilei

    22.07.2010

    0 ↑
    0 ↓
    Добрый день!

    Никак не могу спроектировать модели для хранения таблицы:
    Изначально была создана модель для строки данных 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)
    Поля в таблице заполняются попарно (или a1 и a2 не пусто, или b1 и b2 не пусто, или a1,a2,b1,b2 не пусто). Кажется логичным разбить эту модель на две, для того чтобы избежать множества полупустых строк:
    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)
    Однако хочется не потерять удобность отображения и фильтрации, например с помощью наследования:
    class MyModels_View(MyModel_1,MyModel_2):
    pass
    В этом случае Django автоматом создает OneToOneFields на родителей и при сохранении автоматом создает экземпляры и MyModel_1 и MyModel_2, что приводит к множеству пустых строк.

    Каким образом спроектировать модели, чтобы было удобно и быстро?

    Идеальным для меня вариантом была бы конструкция
    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
    Что позволило бы легко отобразить таблицу со всеми полями a1,a2,b1,b2 по ключам m1,m2..., а так же фильтровать как
    MyModels_View.objects.filter(a2__id__in=ids).filter.(b1__contains=someword)
    Несколько дней уже бьюсь не могу найти решение.
  2. galilei

    22.07.2010

    0 ↑
    0 ↓
    Жду комментариев и предложений. С удовольствием уточню если что плохо объяснил.
  3. Дмитрий

    23.07.2010

    0 ↑
    0 ↓
    Где именно нужно отображать и фильтровать данные?
  4. galilei

    23.07.2010

    0 ↑
    0 ↓
    Данные отображаются в виде таблицы с помощью ExtJS (Ext.grid.GridPanel). Фильтры, это фильтры к этой таблице(Ext.ux.grid.GridFilters)
  5. Vladimir Baskakov

    23.07.2010

    0 ↑
    0 ↓
    Код таблицы:
    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
    });
    Данные передаются в JSON с помощью extdirect.django. Код на сервере примерно такой:
    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)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.