Django外键查询,为什么它返回None?

时间:2011-09-01 21:25:31

标签: django django-models foreign-keys django-queryset

当我尝试使用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}

2 个答案:

答案 0 :(得分: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数据库对象。

答案 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