Django模型继承和select_related

时间:2015-07-25 16:22:41

标签: django django-models django-orm django-inheritance

我在模型中有以下内容,当我使用select_related和模型继承时会遇到奇怪的行为:

型号:

class A(models.Model):
    field_fk = models.ForeignKey('C')

class B(A):
    fields_b = models.CharField(max_length=255)

class C(models.Model):
    field_c = models.CharField(max_length=255)

所以A有一个外键到C和B继承自A. 现在我想查询A向下转发到B并读取与C的关系。为了最小化sql查询,我使用select_related

obj = A.objects.select_related('b', 'field_fk).first()
obj = obj.b          
print(obj.field_fk)  # this prints "C object"

因为我使用select_related,所以这只会产生一个查询。但不知何故,在转发期间信息丢失了,我得到了sql查询:

SELECT ••• FROM "base_a" INNER JOIN "base_c" ON 
      ( "base_a"."field_fk_id" = "base_c"."id" ) LEFT OUTER JOIN "base_b" ON 
      ( "base_a"."id" = "base_b"."a_ptr_id" ) ORDER BY "base_a"."id" ASC LIMIT 1

SELECT ••• FROM "base_c" WHERE "base_c"."id" = 1

所以在第一个查询看起来很好。但我很惊讶我得到了第二个查询。 这是django的ORM中的错误还是我做错了什么?

2 个答案:

答案 0 :(得分:0)

您重新分配obj变量,所以您基本上做的是:

print(obj.b.field_fk)

.b.field_fk未被选为相关对象。因此,要么将其添加到select_related中,要么在重新分配obj变量

之前重复使用预取的对象

答案 1 :(得分:0)

如前所述,我在django-project上提交了一张票。 https://code.djangoproject.com/ticket/25173

现在这被视为一个错误,希望很快得到解决。

建议的解决方法是:

 obj = obj.b        
 print (obj.a_ptr.field_fk)