Ticket #5642: patch-foreignkey-attributeerror.diff

File patch-foreignkey-attributeerror.diff, 6.9 KB (added by Gregor_Kopka, 7 years ago)
  • django/db/models/options.py

     
    152152            rel_objs = []
    153153            for klass in get_models():
    154154                for f in klass._meta.fields:
    155                     if f.rel and self == f.rel.to._meta:
     155                    if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta:
    156156                        rel_objs.append(RelatedObject(f.rel.to, klass, f))
    157157            self._all_related_objects = rel_objs
    158158            return rel_objs
     
    186186            rel_objs = []
    187187            for klass in get_models():
    188188                for f in klass._meta.many_to_many:
    189                     if f.rel and self == f.rel.to._meta:
     189                    if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta:
    190190                        rel_objs.append(RelatedObject(f.rel.to, klass, f))
    191191            if app_cache_ready():
    192192                self._all_related_many_to_many_objects = rel_objs
  • django/core/management/validation.py

     
    7070            # Check to see if the related field will clash with any
    7171            # existing fields, m2m fields, m2m related objects or related objects
    7272            if f.rel:
    73                 rel_opts = f.rel.to._meta
    7473                if f.rel.to not in models.get_models():
    7574                    e.add(opts, "'%s' has relation with model %s, which has not been installed" % (f.name, rel_opts.object_name))
    76 
    77                 rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
    78                 rel_query_name = f.related_query_name()
    79                 for r in rel_opts.fields:
    80                     if r.name == rel_name:
    81                         e.add(opts, "Accessor for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
    82                     if r.name == rel_query_name:
    83                         e.add(opts, "Reverse query name for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
    84                 for r in rel_opts.many_to_many:
    85                     if r.name == rel_name:
    86                         e.add(opts, "Accessor for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
    87                     if r.name == rel_query_name:
    88                         e.add(opts, "Reverse query name for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
    89                 for r in rel_opts.get_all_related_many_to_many_objects():
    90                     if r.get_accessor_name() == rel_name:
    91                         e.add(opts, "Accessor for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
    92                     if r.get_accessor_name() == rel_query_name:
    93                         e.add(opts, "Reverse query name for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
    94                 for r in rel_opts.get_all_related_objects():
    95                     if r.field is not f:
     75                else:
     76                    rel_opts = f.rel.to._meta
     77                    rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
     78                    rel_query_name = f.related_query_name()
     79                    for r in rel_opts.fields:
     80                        if r.name == rel_name:
     81                            e.add(opts, "Accessor for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
     82                        if r.name == rel_query_name:
     83                            e.add(opts, "Reverse query name for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
     84                    for r in rel_opts.many_to_many:
     85                        if r.name == rel_name:
     86                            e.add(opts, "Accessor for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
     87                        if r.name == rel_query_name:
     88                            e.add(opts, "Reverse query name for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
     89                    for r in rel_opts.get_all_related_many_to_many_objects():
    9690                        if r.get_accessor_name() == rel_name:
    97                             e.add(opts, "Accessor for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
     91                            e.add(opts, "Accessor for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
    9892                        if r.get_accessor_name() == rel_query_name:
    99                             e.add(opts, "Reverse query name for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
     93                            e.add(opts, "Reverse query name for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
     94                    for r in rel_opts.get_all_related_objects():
     95                        if r.field is not f:
     96                            if r.get_accessor_name() == rel_name:
     97                                e.add(opts, "Accessor for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
     98                            if r.get_accessor_name() == rel_query_name:
     99                                e.add(opts, "Reverse query name for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
    100100
    101101        for i, f in enumerate(opts.many_to_many):
    102102            # Check to see if the related m2m field will clash with any
Back to Top