Форум сайта python.su
В наследство досталась база , изменять ничего нельзя.
Есть несколько таблиц вида “код” “расшифровка”, есть таблица “предмет” с полями, содержащие эти все коды. Как мне в итоговом 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()
Офлайн
А это разве будет работать без syncdb? мне нельзя модифировать БД.
Плюс, как я уже говорил, в таблицах первичных ключей нет, только абстрактные код-наименование (правда, код всегда уникален), а без этого, вроде ForeignKey работать не будет
Офлайн
Unnamed_HeroТак объявите primary_key=True в модели, чтобы типы только совпадали, syncdb не нужно делать (точнее, когда понадобится сделать syncdb для других приложений, закомментируйте свое приложение в settings.py).
Плюс, как я уже говорил, в таблицах первичных ключей нет, только абстрактные код-наименование (правда, код всегда уникален), а без этого, вроде 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 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 ()
class my_MainDB (MainDB):
tr1_value = models.ForeignKey (Translation1)
#views.py
result = my_MainDB.gos_req.select_related() #gos_req - мой менеджер
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
Отредактировано (Авг. 1, 2009 00:18:14)
Офлайн
Unnamed_Hero
Вы что-то очень суетитеть и мечитесь. При этом каждый раз новый код какой-то показываете. И потом, у вас абсолютно идиотские названия полей, моделей и атрибутов. Поскольку в Джнаге вы можете использовать названия отличные от названий в базе, то настоятельно вам это рекомендую. Я думаю во многом и из-за этого вы до сих пор не может понять как вам решить задачу и даже нормально её сформулировать. Такое ощущение, как-будто вы боитесь чего-то больше показать конкретного из вашей задачи и всё время какими-то допущениями и предположениями запутываете и себя и нас.
Но по сути:
Unnamed_HeroПочему вы убрали ForeignKey? В нем же вся суть.
структура БД у меня примерно такая.
Unnamed_HeroЕсли вы правильно сделете модель, то поймет.
но понятно, что джанга не поймёт, какое поле из MainDB синхронизировать с полем из Translation1
Unnamed_HeroНу вот и всё, теперь вы можете итерироваться по my_MainDB и получать описания кодов:
result = my_MainDB.gos_req.select_related() #gos_req - мой менеджер
for o in result:
print o.tr1_value.description
Офлайн
Перемудрил немного, да уж. А что имена такие - так это ТЗ такое, и от него никуда. А задача решилась весьма просто - в главном классе на все поля с кодами повесил ForeignKey, к каждома прикрутил db_column, вместо менеджера, ограничивающего выборку полей, написал .only в QuerySet'е (ибо поле может содержать NULL'и);
сижу, впечатляюсь мощью джанги и вашим терпением. И своей расторопностью. Спасибо.
Офлайн