Запрос внешнего ключа Django, почему он возвращает None?

Когда я пытаюсь запросить внешние ключи с помощью get(), я всегда получаю значения None, хотя я знаю, что в БД они установлены на 1. Я что-то упустил здесь? Должен ли я сделать что-то другое, чтобы получить значения внешнего ключа?

Вот как выглядит код:

class Car_to_brand( models.Model ):
    brand_id = models.ForeignKey( Brand, db_column='brand_id' )
    ...

class Brand( models.Model ):
    (id is not defined here but it's the primary key)
    ...

print Car_to_brand.__dict__.get( brand_id )

Это дало бы мне {brand_id:None}, но должно быть {brand_id:1}.


person Tickon    schedule 01.09.2011    source источник


Ответы (2)


Проблема в том, что вы назвали свое поле brand_id, а не бренд. get(brand_id) возвращает None, потому что ключа brand_id нет в словаре. Если вы напечатаете car.__dict__, вы увидите, что вместо него содержится brand_id_id.

Однако крайне необычно обращаться к атрибутам с помощью instance.__dict__.get(). Вместо этого попробуйте следующее:

class Car( models.Model ):
    brand = models.ForeignKey(Brand) # don't need to set db_column, brand_id is the default


car.brand_id # this is the id of the brand (e.g. 1) that this car is linked to 
car.brand # this is the brand instance
person Alasdair    schedule 01.09.2011
comment
Спасибо! вы были правы, он содержит brand_id_id вместо brand_id... Это была моя проблема. - person Tickon; 02.09.2011
comment
Аласдер: Разве последняя строка не должна быть car.brand.id? В Car нет поля для brand_id. - person Elf Sternberg; 02.09.2011
comment
@Elf: Нет, я имею в виду car.brand_id. Возможно, мой «# комментарий» был неясен, я пытался его прояснить. Если у вас есть внешний ключ car.brand, вы можете получить доступ к идентификатору как car.brand_id. См. docs.djangoproject.com/en/dev/ref/ модели/поля/. car.brand.id приведет к дополнительному поиску django для получения бренда из базы данных. - person Alasdair; 02.09.2011
comment
@Alasdair: pipeline.user: elfsternberg, но pipeline.user_id: AttributeError: объект «Конвейер» не имеет атрибута «user_id». В документах, на которые вы ссылаетесь, указано, что он создает таблицу с имя столбца brand_id, а не создает атрибут объекта с таким именем. - person Elf Sternberg; 02.09.2011
comment
@Elf: Вы правы, ссылка на документы не очень полезна. На данный момент не могу найти лучше. Но для всех моих внешних ключей, которые я только что протестировал, я могу получить доступ к instance.fk_field и instance.fk_field_id. Не видя определения модели для Pipeline, я не знаю, почему pipeline.user_id вызывает AttributeError. - person Alasdair; 02.09.2011

Вам не нужно указывать Django, как выполнять свою работу. Поле не является «brand_id» для внешнего ключа, это просто «бренд», потому что, хотя таблица «Автомобиль» (в моем примере ниже я переименовал вашу модель) имеет только идентификатор бренда, когда вы разыменовываете somecar.brand Django предоставит вам экземпляр связанного с ним объекта бренда.

class Car(models.Model):
    brand = models.ForeignKey(Brand)
    carname = models.TextField()

class Brand(models.Model):
    brandname = models.TextField() # supplied for example

Это создает отношения между автомобилем и его брендом. Это все, что вам нужно.

Теперь вы можете говорить такие вещи, как

 car = Car.objects.get(carname = "Corvette")
 print car.brand.brandname # prints "Chevrolet" unless your database is hosed.
 print car.brand.id # prints the unique key Django uses to keep track of these relationships

Что касается последней строки вашего примера, что вы пытаетесь сделать? Car_to_brand — это класс, описывающий объект базы данных; это не сам объект, и поэтому, хотя он описывает отношение к бренду, у него нет собственного бренда.


Немного ясности в последнем предложении. Car_to_brand — это объект Python в том смысле, что все в python является объектом некоторого рода, но это объект класса, который описывает таблицу базы данных, ее методы доступа и отношения. Это не объект базы данных Django.

person Elf Sternberg    schedule 01.09.2011
comment
Спасибо за вашу помощь, которая прояснила правильное использование Django. - person Tickon; 02.09.2011