#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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/01070194f4555c54-fb087c46-ec14-4c39-a91c-d06f60ea76af-000000%40eu-central-1.amazonses.com.

Reply via email to