gpt4 book ai didi

Django select_related 与指定的字段打破多个一对一关系

转载 作者:行者123 更新时间:2023-12-03 17:58:39 28 4
gpt4 key购买 nike

我在尝试通过多个 OneToOneField 关系进行 select_related 时遇到一个奇怪的错误,例如在目标字段是孙子类的情况下。我希望有人帮助我了解发生了什么(或确认这是 Django 中的错误)。

插图:

# models.py
from django.db import models

class A(models.Model):
pass

class B(A):
pass

class C(B):
pass

够简单了吧?现在我用一个干净的数据库打开 Django shell:
>>> C().save()
>>> A.objects.select_related('b__c')
[]

等等,什么?为什么那个查询集是空的?快速的健全性检查:
>>> A.objects.select_related('b')[0].b.c
<C: C object>

那么为什么 select_related 调用不起作用呢?嗯,看这个:
>>> A.objects.select_related('b__c').__iter__().next()
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 107, in _result_iter
self._fill_cache()
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 772, in _fill_cache
self._result_cache.append(self._iter.next())
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 273, in iterator
for row in compiler.results_iter():
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter
for rows in self.execute_sql(MULTI):
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 725, in execute_sql
sql, params = self.as_sql()
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 58, in as_sql
self.pre_sql_setup()
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 29, in pre_sql_setup
self.fill_related_selections()
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 661, in fill_related_selections
used, next, restricted, new_nullable)
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 617, in fill_related_selections
chain = opts.get_base_chain(f.rel.to)
File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/options.py", line 452, in get_base_chain
% model._meta.module_name,)
TypeError: 'b' is not an ancestor of this model
>>>

那么,这是一个 Django 错误,还是我不明白什么?

最佳答案

我将 name=CharField 添加到 A 并在 shell 中运行以下测试:

>>> a = A(name='a_object')
>>> a.save()
>>> b = B(name='b_object')
>>> b.save()
>>> c = C(name='c_object')
>>> c.save()

>>> A.objects.all()
[<A: A object>, <A: A object>, <A: A object>]
>>> B.objects.all()
[<B: B object>, <B: B object>]
>>> C.objects.all()
[<C: C object>]

>>> A.objects.select_related('b__c')
[]
>>> A.objects.select_related('b__c').__iter__().next()
Traceback ....
...
TypeError: 'b' is not an ancestor of this model

>>> d = A.objects.select_related('B__C')
>>> for item in d:
... print item.name
...
a_object
b_object
c_object

>>> test = A.objects.select_related('B__C').__iter__().next()
>>> test.name
u'a_object'

我知道这不是一个答案,我不知道该怎么做。但基本上我发现小写字母似乎并不意味着没有模型中的字段。

关于Django select_related 与指定的字段打破多个一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887779/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com