Tôi nhận được một lỗi lạ khi cố gắng select_related qua nhiều mối quan hệ OneToOneField, ví dụ: trong trường hợp trường mục tiêu là một lớp con cháu. Tôi muốn một người nào đó giúp tôi hiểu những gì đang xảy ra (hoặc xác nhận rằng đây là một lỗi ở Django).Django select_related với các trường được chỉ định ngắt trên nhiều mối quan hệ một đến một
Minh họa:
# models.py
from django.db import models
class A(models.Model):
pass
class B(A):
pass
class C(B):
pass
đơn giản đủ, đúng không? Bây giờ tôi mở vỏ Django bằng một cơ sở dữ liệu sạch:
>>> C().save()
>>> A.objects.select_related('b__c')
[]
Chờ đợi, cái gì? Tại sao bộ truy vấn đó trống? Kiểm tra sanity nhanh:
>>> A.objects.select_related('b')[0].b.c
<C: C object>
Vậy tại sao cuộc gọi select_related không hoạt động? Vâng, hãy xem điều này:
>>> 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
>>>
Vì vậy, đây có phải là lỗi Django hay tôi không hiểu điều gì đó?
Do sự im lặng về vấn đề này, tôi đã gửi một lỗi: https://code.djangoproject.com/ticket/16572 – rfrankel
gặp vấn đề tương tự. hành vi kỳ lạ, có vẻ như một lỗi django thực sự. –