Найти - Пользователи
Полная версия: объединение queryset'ов
Начало » Django » объединение queryset'ов
1
Unnamed_Hero
В наследство досталась база , изменять ничего нельзя.
Есть несколько таблиц вида “код” “расшифровка”, есть таблица “предмет” с полями, содержащие эти все коды. Как мне в итоговом queryset выводить предметы с расшифровками кодов, а не сами коды? На ум приходит только RAW SQL…
Александр Кошелев
хм… так это банальный 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()
Unnamed_Hero
А это разве будет работать без syncdb? мне нельзя модифировать БД.

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

Вот что у меня есть:
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,… - это как раз таблицы с кодами и их расшифровками.
Александр Кошелев
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
Unnamed_Hero
Перемудрил немного, да уж. А что имена такие - так это ТЗ такое, и от него никуда. А задача решилась весьма просто - в главном классе на все поля с кодами повесил ForeignKey, к каждома прикрутил db_column, вместо менеджера, ограничивающего выборку полей, написал .only в QuerySet'е (ибо поле может содержать NULL'и);
сижу, впечатляюсь мощью джанги и вашим терпением. И своей расторопностью. Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB