【问题标题】: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}

【问题讨论】:

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


    【解决方案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 的正确用法。
    猜你喜欢
    • 2018-09-29
    • 2014-08-24
    • 2020-06-22
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多