编辑:
- 我在下面修正了一些错别字
- 我在一个小应用程序中添加了一个 zip 文件来演示这个问题。您可以在 syncdb 和迁移后下载并运行 python manage.py testselectrelateddefer。
- 我在下面添加了一些观察结果
我修复我有一个多表继承模型,如下所示:
class Image(models.Model):
# other fields are removed for simplicity
image = models.ImageField(upload_to="image")
class ItemImage(Image):
# other fields are removed for simplicity
display_name = models.CharField(max_length=50)
当我不需要图像(在父模型中)时,我想查询这个模型并推迟图像字段。我的容器模型看起来有点像这样:
class Item(models.Model):
item_image = models.OneToOneField(ItemImage)
查询如下所示:
test.models.Item.objects.select_related('item_image').defer("item_image__image").get(pk=1)
Django 抛出一个错误说:
ValueError: u'image_ptr_id' is not in the list.
如果我查询不在父模型中的字段,Django 不会抛出错误:
test.models.Item.objects.select_related('item_image').defer("item_image__display_name").get(pk=1)
你知道如何解决这个问题吗?
观察:
- 正如我上面提到的,这只有在延迟字段在父模型中时才会发生;如果延迟字段在子模型中,则不会发生这种情况。
- 父母字段是否有任何额外字段都没有关系。