Запрос внешнего ключа Django, почему он возвращает None? - PullRequest
0 голосов
/ 02 сентября 2011

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

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

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}.

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Проблема в том, что вы назвали свое поле 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
1 голос
/ 02 сентября 2011

Вам не нужно рассказывать Джанго, как выполнять свою работу.Поле не «brand_id» для внешнего ключа, это просто «brand», потому что хотя таблица «Car» (в моем примере я переименовал вашу модель) имеет идентификатор бренда только при разыменовании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 является объектом некоторого рода, но это объект Class, который описывает таблицу базы данных, ее методы доступа и отношения.Это не объект базы данных Django.

...