Уведомления

Группа в Telegram: @pythonsu

#1 Июль 30, 2009 13:54:38

Unnamed_Hero
От:
Зарегистрирован: 2009-06-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объединение queryset'ов

В наследство досталась база , изменять ничего нельзя.
Есть несколько таблиц вида “код” “расшифровка”, есть таблица “предмет” с полями, содержащие эти все коды. Как мне в итоговом queryset выводить предметы с расшифровками кодов, а не сами коды? На ум приходит только RAW SQL…



Офлайн

#2 Июль 30, 2009 14:39:48

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

объединение queryset'ов

хм… так это банальный ForeignKey

class Translation1(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class Translation2(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class TranslationN(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class Object(models.Model):
field1 = models.ForeignKey(Translation1)
field2 = models.ForeignKey(Translation2)

fieldN = models.ForeignKey(TranslationN)

qs = Object.objects.all().select_related()



Офлайн

#3 Июль 30, 2009 15:08:37

Unnamed_Hero
От:
Зарегистрирован: 2009-06-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объединение queryset'ов

А это разве будет работать без syncdb? мне нельзя модифировать БД.

Плюс, как я уже говорил, в таблицах первичных ключей нет, только абстрактные код-наименование (правда, код всегда уникален), а без этого, вроде ForeignKey работать не будет



Офлайн

#4 Июль 30, 2009 16:06:30

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

объединение queryset'ов

Unnamed_Hero
Плюс, как я уже говорил, в таблицах первичных ключей нет, только абстрактные код-наименование (правда, код всегда уникален), а без этого, вроде ForeignKey работать не будет
Так объявите primary_key=True в модели, чтобы типы только совпадали, syncdb не нужно делать (точнее, когда понадобится сделать syncdb для других приложений, закомментируйте свое приложение в settings.py).
Тогда ForeingnKey будет работать. Только не забудьте db_column везде определить, чтобы Джанга имена полей не корректировала.



Офлайн

#5 Авг. 1, 2009 00:17:11

Unnamed_Hero
От:
Зарегистрирован: 2009-06-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объединение queryset'ов

Переправлю своё сообщение, что-то я там совсем в другую плоскость уехал. Итак….

Вот что у меня есть:

class Translation1(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class Translation2(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class TranslationN(models.Model):
code = models.IntegerField(primary_key=True)
description = models.CharField()

class MainDB (models.Model):
tr1_code = models.IntegerField()
tr2_code = models.IntegerField()
tr3_code = models.IntegerField()
name = models.CharField()
model = models.CharField ()
some_field1 = models.CharField ()
some_fieldN = models.CharField ()
структура БД у меня примерно такая.
теперь вопрос - как наименее бескровно вывести инфу из MainDB (взять оттуда только поля name и model и все коды - только вместо кодов - их расшифровки)

для выборки только нужных полей из MainDB я сделал свой менеджер, и он работает. А вот как в один queryset запихнуть расшифровку из других моделей - придумать не могу. Пока попытался так
class my_MainDB (MainDB):
tr1_value = models.ForeignKey (Translation1)

#views.py
result = my_MainDB.gos_req.select_related() #gos_req - мой менеджер
но понятно, что джанга не поймёт, какое поле из MainDB синхронизировать с полем из Translation1
пробовал подсовывать db_colunm в tr_value - не помогло. На выходе - ноль.


в оригинале SQL запрос выглядел так
SELECT A1,A2,A20,A18,A45,A4,A5,A41,A36,A38,K1,K2,A27,A25,FED.RA,FED.N1,EC.RA,EC.N1,A34 FROM C12B,RKA,C014P FED,C014P EC WHERE A34='02100' AND A38=K1 AND A41=FED.RA AND A36=EC.RA ORDER BY A1
c12b - это как раз MainDB, а RKA, C014P, FED,… - это как раз таблицы с кодами и их расшифровками.



Отредактировано (Авг. 1, 2009 00:18:14)

Офлайн

#6 Авг. 1, 2009 12:13:15

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

объединение queryset'ов

Unnamed_Hero
Вы что-то очень суетитеть и мечитесь. При этом каждый раз новый код какой-то показываете. И потом, у вас абсолютно идиотские названия полей, моделей и атрибутов. Поскольку в Джнаге вы можете использовать названия отличные от названий в базе, то настоятельно вам это рекомендую. Я думаю во многом и из-за этого вы до сих пор не может понять как вам решить задачу и даже нормально её сформулировать. Такое ощущение, как-будто вы боитесь чего-то больше показать конкретного из вашей задачи и всё время какими-то допущениями и предположениями запутываете и себя и нас.

Но по сути:

Unnamed_Hero
структура БД у меня примерно такая.
Почему вы убрали ForeignKey? В нем же вся суть.
Unnamed_Hero
но понятно, что джанга не поймёт, какое поле из MainDB синхронизировать с полем из Translation1
Если вы правильно сделете модель, то поймет.
Unnamed_Hero
result = my_MainDB.gos_req.select_related() #gos_req - мой менеджер
Ну вот и всё, теперь вы можете итерироваться по my_MainDB и получать описания кодов:
for o in result:
print o.tr1_value.description



Офлайн

#7 Авг. 1, 2009 15:06:01

Unnamed_Hero
От:
Зарегистрирован: 2009-06-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объединение queryset'ов

Перемудрил немного, да уж. А что имена такие - так это ТЗ такое, и от него никуда. А задача решилась весьма просто - в главном классе на все поля с кодами повесил ForeignKey, к каждома прикрутил db_column, вместо менеджера, ограничивающего выборку полей, написал .only в QuerySet'е (ибо поле может содержать NULL'и);
сижу, впечатляюсь мощью джанги и вашим терпением. И своей расторопностью. Спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version