Форум сайта python.su
Nick2009Вот. Это знание только у вас в голове. За шесть постов в этот тред вы так и не догадались показать ваш актуальный код с которым вы пробуете обсуждаемые приемы. Поэтому единственное что мы можем (отвечающие) это всё пристальнее вглядываться в стеклянный шар чтобы увидеть что же у вас не работает.
Не надо ничего предполагать. Я всегда явно задаю все имена.
Nick2009Это вы сами придумали?
Если таблица item, то класс Item, PK и FK везде “item_id” и совпадают с именем поля, о чем явно прописано в модели.
Тип этого поля везде INTEGER.
Присвоить нужно INTEGER именно в том месте, где нужно, а не в ссылочной таблице.
Nick2009Да отключайте сразу всю Джангу - столько проблем создает, что ужас!
Нужно полностью отключить всю функциональность джанговского ForeignKey. КАК?
Nick2009Увы не поняли.
Кстати, так как Вы написали, я с трудом понял, но сделал
class SomeModel:
item = models.ForeignKey(AnotherModel)
obj = SomeModel()
obj.item_id=777
Nick2009Опять плохо и не то проверяли.
Я проверил, всё так и есть.
Nick2009Вам надо научиться задавать вопросы и слушать ответы. А ещё банально больше изучать Джангу и вообще питон.
Мне не эта магия нужна, а простое присвоение!
Офлайн
DaevaornЗаметьте, не я это предложил.
Да отключайте сразу всю Джангу - столько проблем создает, что ужас!
Офлайн
DaevaornДа знаю я это. В модели я явно задаю имя поля. И Django это понимает, т.е не пытается добавлять _id. И читает это поле и выборки по нему делает. Почему она это-же не понимает, когда нужно присвоить этому полю значение?
Прположим(!) есть модель:
Код:
class SomeModel:
item = models.ForeignKey(AnotherModel)
При этом в БД в таблице app_somemodels будет поле item_id (_id добавляется автоматически). Негласно вы имеете к нему доступ и при работе c ORM:
Офлайн
lorienПридется делать так, другого выхода Джанга не дает, написано уже много кода править придется много, код получится запутанный и плохо читаемый:
Похоже вы сами себе жизнь осложнили :) Или уберите db_column='item_id' и тогда колонка будет item_id_id и вы сможете делать obj.item_id_id = 44 или назоваите поле по человечески, не item_id, а просто item т.е.В таком случае у вас будет работать присвоение obj.item_id = 44class SomeModel:
item = models.ForeignKey()
class SomeModel: #Таблица с id PK по умолчанию, лишена возможности NATURAL JOIN
zz_id = models.IntegerField() #Это поле без FK, но является идентификатором в другой таблице. С ним всё нормально.
xx = models.ForeignKey() # в базе реально xx_id и это надо держать в голове для всех полей базы данных,
а в коде всегда помнить, где нужно писать xx, где xx__xx_id, а где xx_id для одного и того же поля одной и той же таблицы.
yy = models.ForeignKey() # будут проблемы в случае если в базе требуется именно имя "yy" и нужно по нему сделать FK,
тоже нужно держать в голове.
и т.д. и т.п.
Отредактировано (Окт. 19, 2009 12:01:51)
Офлайн
lorienСхему я полностью сам делаю, знаю всё что там есть, а db_column только для Джанго пишу.
db_column выполняет задачу :) Посмотрите в схему таблицы - там будет колонка названная item_id - именно это и делает db_column - задаёт имя колонки. А при работе с ORM вы не можете назначит в item_id числовые данные т.к. доступ к колонке перезатирается одноимённым полем item_id = models.ForeignKey.
Если у вас какая-то старая база данных, колонки в которой нельзя переименовать, может быть, имеет смысл, не использовать Django? Django ведь не панацея, используйте голый DB API не будет там магии никакой ;-) Или есть ещё куча ORM та же SQLAlchemy
Офлайн
Вот например, вроде всё делаю по Джанговски, но сразу проблема с FK.
Все FK оформил без _id, поля в таблицах конечно c _id, надеюсь на умолчания Джанги
Что опять не так?
class MyUsers(models.Model):
user=models.OneToOneField(User,primary_key=True)
group=models.ForeignKey(Group)
# Задача, по известному значению _group_id получить данные из MyUsers
# с именами из auth-user и НЕ запрашивать данные из Group
users = MyUsers.objects.select_relation('user__first_name','group_id').filter(group_id=_group_id).order_by('user__first_name')
Офлайн
Nick2009Читайте документацию
Т.е. тупик получается.
Офлайн
DaevaornЯ тоже в совершенстве эти слова знаю
Читайте документацию
Отредактировано (Окт. 20, 2009 19:24:38)
Офлайн
Nick2009Вы начали использовтаь новый инструмент - было бы наивно пологать, что его можно освоить, не изучив его специфику и поведенение в различных ситуациях.
Вот именно, пока от корки до корки все умолчания не выучишь, что-либо серьезное фиг напишешь, и всё равно придется с бубном прыгать.
Читаю, я читаю, а мне дело делать надо, времени уже нет. Надеялся с помощью этого замечательного фреймворка ускорить работу, а получилось еще хуже.
Nick2009Да. И про select_related и про OneToOneField.
Вы что-то конкретное имели ввиду или просто так сказали?
Nick2009Умница. Дело за малым - понять что они означают и выполнить;-)
Я тоже в совершенстве эти слова знаю
Офлайн
Nick2009Что за select_relation ?
class MyUsers(models.Model): user=models.OneToOneField(User,primary_key=True) group=models.ForeignKey(Group) # Задача, по известному значению _group_id получить данные из MyUsers # с именами из auth-user и НЕ запрашивать данные из Group users = MyUsers.objects.select_relation('user__first_name','group_id').filter(group_id=_group_id).order_by('user__first_name')
Отредактировано (Окт. 21, 2009 22:43:55)
Офлайн