Найти - Пользователи
Полная версия: Проблема с ForeignKey
Начало » Django » Проблема с ForeignKey
1 2
Александр Кошелев
Nick2009
Не надо ничего предполагать. Я всегда явно задаю все имена.
Вот. Это знание только у вас в голове. За шесть постов в этот тред вы так и не догадались показать ваш актуальный код с которым вы пробуете обсуждаемые приемы. Поэтому единственное что мы можем (отвечающие) это всё пристальнее вглядываться в стеклянный шар чтобы увидеть что же у вас не работает.
Nick2009
Если таблица item, то класс Item, PK и FK везде “item_id” и совпадают с именем поля, о чем явно прописано в модели.
Тип этого поля везде INTEGER.
Присвоить нужно INTEGER именно в том месте, где нужно, а не в ссылочной таблице.
Это вы сами придумали?
Nick2009
Нужно полностью отключить всю функциональность джанговского ForeignKey. КАК?
Да отключайте сразу всю Джангу - столько проблем создает, что ужас!
Nick2009
Кстати, так как Вы написали, я с трудом понял, но сделал
Увы не поняли.

Прположим(!) есть модель:
class SomeModel:
item = models.ForeignKey(AnotherModel)
При этом в БД в таблице app_somemodels будет поле item_id (_id добавляется автоматически). Негласно вы имеете к нему доступ и при работе c ORM:
obj = SomeModel()
obj.item_id=777
Nick2009
Я проверил, всё так и есть.
Опять плохо и не то проверяли.
Nick2009
Мне не эта магия нужна, а простое присвоение!
Вам надо научиться задавать вопросы и слушать ответы. А ещё банально больше изучать Джангу и вообще питон.
Nick2009
Daevaorn
Да отключайте сразу всю Джангу - столько проблем создает, что ужас!
Заметьте, не я это предложил.
Nick2009
Daevaorn
Прположим(!) есть модель:
Код:

class SomeModel:
item = models.ForeignKey(AnotherModel)

При этом в БД в таблице app_somemodels будет поле item_id (_id добавляется автоматически). Негласно вы имеете к нему доступ и при работе c ORM:
Да знаю я это. В модели я явно задаю имя поля. И Django это понимает, т.е не пытается добавлять _id. И читает это поле и выборки по нему делает. Почему она это-же не понимает, когда нужно присвоить этому полю значение?

class SomeModel:
item_id = models.ForeignKey(AnotherModel, db_column='item_id')
Nick2009
lorien
Похоже вы сами себе жизнь осложнили :) Или уберите db_column='item_id' и тогда колонка будет item_id_id и вы сможете делать obj.item_id_id = 44 или назоваите поле по человечески, не item_id, а просто item т.е.
class SomeModel:
item = models.ForeignKey()
В таком случае у вас будет работать присвоение obj.item_id = 44
Придется делать так, другого выхода Джанга не дает, написано уже много кода править придется много, код получится запутанный и плохо читаемый:

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,
тоже нужно держать в голове.
и т.д. и т.п.
В общем “Тут читать, тут не читать, тут рыбу заворачивали…”

Явными наименованиями я хотел себе жизнь упростить, а не усложнить. Джанга усложняет неявными условиями и скрытой магией, которая не везде одинаково работает. Почему в данном случае db_column не выполняет своей задачи, кто-нибудь может ответить?
Nick2009
lorien
db_column выполняет задачу :) Посмотрите в схему таблицы - там будет колонка названная item_id - именно это и делает db_column - задаёт имя колонки. А при работе с ORM вы не можете назначит в item_id числовые данные т.к. доступ к колонке перезатирается одноимённым полем item_id = models.ForeignKey.

Если у вас какая-то старая база данных, колонки в которой нельзя переименовать, может быть, имеет смысл, не использовать Django? Django ведь не панацея, используйте голый DB API не будет там магии никакой ;-) Или есть ещё куча ORM та же SQLAlchemy
Схему я полностью сам делаю, знаю всё что там есть, а db_column только для Джанго пишу.
Уже влез поуши, придется приспосабливаться.
Nick2009
Вот например, вроде всё делаю по Джанговски, но сразу проблема с 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')
Если оставить так, и
u = MyUsers.objects.get(user=_user_id)
или так
u = MyUsers.objects.get(user__id=_user_id)
Cannot resolve keyword ‘user’ into field.

u = MyUsers.objects.get(user_id=_user_id)
Cannot resolve keyword ‘user_id’ into field.

Ошибка исправляется только если всезде указать user_id и задать db_column

Затем таже история с group и group_id

Cannot resolve keyword ‘group’ into field.

Если задать везде имя поля group_id, то ошибка исправляется. Но мы то уже знаем, что потом наверняка будет ошибка, когда я попытаюсь присвоить этому полю значение.

Т.е. тупик получается.
Александр Кошелев
Nick2009
Т.е. тупик получается.
Читайте документацию
Nick2009
Daevaorn
Читайте документацию
Я тоже в совершенстве эти слова знаю
Александр Кошелев
Nick2009
Вот именно, пока от корки до корки все умолчания не выучишь, что-либо серьезное фиг напишешь, и всё равно придется с бубном прыгать.
Читаю, я читаю, а мне дело делать надо, времени уже нет. Надеялся с помощью этого замечательного фреймворка ускорить работу, а получилось еще хуже.
Вы начали использовтаь новый инструмент - было бы наивно пологать, что его можно освоить, не изучив его специфику и поведенение в различных ситуациях.

Потом, вы упорно стараетесь все его плюшки задавить, что тоже не правильно. Вы имеете у себя в голове какое-то странное, не на чем не основанное, представление “как оно должно работать” и когда оно не работает так как вы себе напридумывали (удивительно - правда?) вы впадаете в апатию и начинаете ругать фреймворк. Может быть стоит свой подход пересмотреть?

И лучше один раз вдумчиво прочитать и понять чем “читаю, я читаю” и не осмысливать прочитанное.

Nick2009
Вы что-то конкретное имели ввиду или просто так сказали?
Да. И про select_related и про OneToOneField.

Nick2009
Я тоже в совершенстве эти слова знаю
Умница. Дело за малым - понять что они означают и выполнить;-)
Evg
Nick2009
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')
Что за select_relation ?
Для начала не нужно усложнать себе жизнь такими задачами, и выбить из головы стереотипы о том что там фоном не должно идти много запросов, если group_id известен то просто берите first_name так

for u in MyUsers.objects.filter(group__id = group_id)
print u.user.first_name

И не нужно параноиться по поводу числа запросов это не тот случай.
На край можно примерно так сделать, но и то нафиг надо:
uids = list (u.user_id for u in MyUsers.objects.filter(group__id = group_id))
for u in Users.objects.filter(id__in = uids):
print u.first_name

или даже лучше select_related() в первом случ. использовать он join и сделает
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