#36183: Model o2o inheritance with abstract models does not "evaluate" a lazy
relationship
-------------------------------------+-------------------------------------
Reporter: BeryCZ | Type: Bug
Status: new | Component: Database
| layer (models, ORM)
Version: 5.1 | Severity: Normal
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
When I define models like this
{{{#!python
class AbstractPage(models.Model):
mtime = models.DateTimeField(
verbose_name="Last modification at",
auto_now=True,
)
class Meta:
abstract = True
class AbstractPageType(models.Model):
page = models.OneToOneField(
"Page",
verbose_name="ID",
primary_key=True,
on_delete=models.CASCADE,
related_name="%(class)s",
parent_link=True,
)
title = models.CharField(
verbose_name="Title",
max_length=255,
null=False,
blank=False,
)
class Meta:
abstract = True
class Page(AbstractPage):
pass
class ArticlePage(AbstractPageType, Page):
pass
}}}
And then I do
{{{#!python
ArticlePage.objects.order_by("-mtime").all()
}}}
I get
{{{
File "django/db/models/manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "django/db/models/query.py", line 1701, in order_by
obj.query.add_ordering(*field_names)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "django/db/models/sql/query.py", line 2249, in add_ordering
self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "django/db/models/sql/query.py", line 1777, in names_to_path
path_to_parent = opts.get_path_to_parent(model)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "django/db/models/options.py", line 755, in get_path_to_parent
targets = (final_field.remote_field.get_related_field(),)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "django/db/models/fields/reverse_related.py", line 311, in
get_related_field
field = self.model._meta.get_field(self.field_name)
^^^^^^^^^^^^^^^^
Exception Type: AttributeError
Exception Value: 'str' object has no attribute '_meta'
}}}
It works when I do
{{{#!python
class ArticlePage(AbstractPageType, Page):
page = models.OneToOneField(
"Page",
verbose_name="ID",
primary_key=True,
on_delete=models.CASCADE,
related_name="%(class)s",
parent_link=True,
)
}}}
but I would prefer not to have to define page field in every PageType.
--
Ticket URL: <
https://code.djangoproject.com/ticket/36183>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.