Django外键查询,为啥它返回None?
Posted
技术标签:
【中文标题】Django外键查询,为啥它返回None?【英文标题】:Django foreign key query, why it returns None?Django外键查询,为什么它返回None? 【发布时间】:2011-11-08 18:09:16 【问题描述】:当我尝试使用 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
。
【问题讨论】:
【参考方案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
【讨论】:
谢谢!你是对的,它包含brand_id_id而不是brand_id...这是我的问题。 Alasdair:最后一行不应该是car.brand.id
吗?汽车中没有 brand_id
的字段。
@Elf:不,我的意思是car.brand_id
。也许我的“#评论”不清楚,我试图澄清它。如果你有一个外键car.brand
,你可以通过car.brand_id
来访问id。见docs.djangoproject.com/en/dev/ref/models/fields/…。 car.brand.id
会导致 django 额外查找以从数据库中获取品牌。
@Alasdair: pipeline.user
: "elfsternberg" but pipeline.user_id
: "AttributeError: 'Pipeline' object has no attribute 'user_id'" 您链接到的文档声明它使用列名“brand_id”,而不是它在具有该名称的对象上创建属性。
@Elf:你说得对,文档的链接不是很有帮助。我目前找不到更好的。但是对于我刚刚测试过的所有外键,我可以访问instance.fk_field
和instance.fk_field_id
。没有看到Pipeline
的模型定义,我不知道为什么pipeline.user_id
会引发AttributeError
。【参考方案2】:
您不需要告诉 Django 如何完成它的工作。该字段不是外键的“brand_id”,它只是“品牌”,因为虽然“汽车”表(在下面的示例中,我已重命名您的模型)只有品牌的 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 数据库对象。
【讨论】:
感谢您的帮助,阐明了 Django 的正确用法。以上是关于Django外键查询,为啥它返回None?的主要内容,如果未能解决你的问题,请参考以下文章