#36183: Model o2o inheritance with abstract models does not "evaluate" a lazy
relationship
-------------------------------------+-------------------------------------
     Reporter:  BeryCZ               |                    Owner:  (none)
         Type:  Bug                  |                   Status:  closed
    Component:  Database layer       |                  Version:  5.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:  invalid
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Comment (by Simon Charette):

 So I tried adapting `BaseModel.__new__` to confirm this was effectively
 never supported with

 {{{#!diff
 diff --git a/django/db/models/base.py b/django/db/models/base.py
 index 575365e11c..5a33f78a98 100644
 --- a/django/db/models/base.py
 +++ b/django/db/models/base.py
 @@ -243,7 +243,17 @@ def __new__(cls, name, bases, attrs, **kwargs):
              for field in base._meta.local_fields:
                  if isinstance(field, OneToOneField) and
 field.remote_field.parent_link:
                      related = resolve_relation(new_class,
 field.remote_field.model)
 -                    parent_links[make_model_tuple(related)] = field
 +                    related_model_tuple = make_model_tuple(related)
 +                    if abstract and not any(
 +                        make_model_tuple(parent) == related_model_tuple
 +                        for parent in parents
 +                        if hasattr(parent, "_meta")
 +                    ):
 +                        raise TypeError(
 +                            "Abstract models must directly inherit from
 parent "
 +                            "links they refer to."
 +                        )
 +                    parent_links[related_model_tuple] = field

          # Track fields inherited from base models.
          inherited_attributes = set()
 }}}

 And the suited failed on
 
[https://github.com/django/django/blob/47c837a1ff96ef1b10b44477a7a9f72283d12e83/tests/model_inheritance_regress/models.py#L37-L50
 these models] which `git-blame` led me to #20883
 (163a34ce4bc1086b346a52c7271f48d2c207f710) which makes me believe this
 either never fully worked (notice the tests are very minimal) or that the
 latest changes to abstract model inheritance field attribution in #24305
 (85ef98dc6ec565b1add417bd76808664e7318026).

 Given we have models in the suite I think we should at least bisect to
 determine if this was ever properly supported but so minimally tested that
 #24305 silently broke it. If it never truly worked then I'd suggest we add
 this `TypeError` otherwise if it was broken by #24305 we should consider
 it like a long standing regression.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36183#comment:4>
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 django-updates+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/01070194fd1ab915-da16373c-3c82-41cd-874b-ff37beefc185-000000%40eu-central-1.amazonses.com.

Reply via email to