У меня есть такая модельная структура:
app1.models
class App(FunkyClassLoadoerMixin, DateMixin):
user = models.OneToOneField(User, blank=False, null=False, db_index=True, unique=True)
# some other fields
class DateMixin(models.Model):
date_added = models.DateTimeField(auto_now_add=True)
app2.models
from app1.models import App as BaseApp
class App(BaseApp)
class Meta:
proxy = True
FunkyClassLoadoerMixin - это просто класс, который помогает загружать дочерние классы немного по-другому, но не влияет на их поведение.
Учитывая это, у меня есть такой запрос:
q = SuperStatic.objects.all().select_related('user__app')
(в этом случае объект приложения должен иметь тип app2.models.App)
И когда он оценивается, я получаю эту ошибку:
local/lib/python2.7/site-packages/django/db/models/query.pyc in get_cached_row(row, index_start, using, klass_info, offset)
1435 for rel_field, rel_model in rel_obj._meta.get_fields_with_model():
1436 if rel_model is not None:
-> 1437 setattr(rel_obj, rel_field.attname, getattr(obj, rel_field.attname))
1438 # populate the field cache for any related object
1439 # that has already been retrieved
AttributeError: 'User' object has no attribute 'date_added'
Я не совсем понимаю, почему это происходит. Я просмотрел исходный код Django, и причина, похоже, в том, что эта функция:
rel_obj._meta.get_fields_with_model()
ведет себя по-другому, когда модель является подклассом и игнорирует тот факт, что это прокси-модель.
Я нашел похожий пост:
- https://code.djangoproject.com/ticket/10955
- http://python.6.x6.nabble.com/Django-17876-get-klass-info-should-handle-proxy-models-and-with-select-related-td4569828.html а>
Но тоже не сильно помогло.
Есть идеи о том, как использовать прокси-класс и избежать этой ошибки?