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