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_fieldinstance.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?的主要内容,如果未能解决你的问题,请参考以下文章

告诉django不要跟随外键?

为啥这个 Django 原始 SQL 查询不返回输出?

DateTimeField 查询集在 Django 中返回 None

Django:每个外键返回一个过滤对象

Django 多注解返回错误结果

Django:强制选择相关?