2011-09-01 88 views
1

當我嘗試使用get()查詢外鍵時,我始終得到None的值,儘管我知道它們在數據庫中設置爲1。我在這裏錯過了什麼嗎?我應該做一些不同的事情來獲得外鍵值嗎?Django外鍵查詢,爲什麼它返回None?

下面的代碼是什麼樣子:

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}

回答

1

問題是您已將您的字段命名爲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 
+0

謝謝!你是對的,它包含brand_id_id而不是brand_id ...這是我的問題。 – Tickon

+0

Alasdair:最後一行不應該是'car.brand.id'嗎?汽車沒有'brand_id'字段。 –

+0

@Elf:不,我的意思是'car.brand_id'。也許我的'評論'不清楚,我試圖澄清它。如果你有一個外鍵'car.brand',你可以用'car.brand_id'來訪問這個ID。請參閱https://docs.djangoproject.com/en/dev/ref/models/fields/#database-representation。 'car.brand.id'會導致額外的查找django從db中獲取品牌。 – Alasdair

1

你不需要告訴Django如何完成它的工作。該字段對於外鍵不是「brand_id」,它只是「品牌」,因爲雖然「Car」表(在我的示例中,我已經更名爲您的模型)只有品牌的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中的所有東西都是某種類型的對象,但它是一個Class對象,它描述了一個數據庫表,它的訪問器和關係。它不是一個Django數據庫對象。

+0

感謝您的幫助,澄清了Django的正確用法。 – Tickon