Django

Code

Changeset 6835

Show
Ignore:
Timestamp:
12/02/07 12:10:07 (7 months ago)
Author:
mtredinnick
Message:

Fixed #3323 -- More robust error handling for related objetcs. Thanks, Greg
Kopka and shaleh.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/core/management/validation.py

    r6590 r6835  
    7373            # existing fields, m2m fields, m2m related objects or related objects 
    7474            if f.rel: 
     75                if f.rel.to not in models.get_models(): 
     76                    e.add(opts, "'%s' has relation with model %s, which has not been installed" % (f.name, f.rel.to)) 
     77                # it is a string and we could not find the model it refers to 
     78                # so skip the next section 
     79                if isinstance(f.rel.to, (str, unicode)): 
     80                    continue 
     81 
    7582                rel_opts = f.rel.to._meta 
    76                 if f.rel.to not in models.get_models(): 
    77                     e.add(opts, "'%s' has relation with model %s, which has not been installed" % (f.name, rel_opts.object_name)) 
    78  
    7983                rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name() 
    8084                rel_query_name = f.related_query_name() 
     
    104108            # Check to see if the related m2m field will clash with any 
    105109            # existing fields, m2m fields, m2m related objects or related objects 
     110            if f.rel.to not in models.get_models(): 
     111                e.add(opts, "'%s' has m2m relation with model %s, which has not been installed" % (f.name, f.rel.to)) 
     112                # it is a string and we could not find the model it refers to 
     113                # so skip the next section 
     114                if isinstance(f.rel.to, (str, unicode)): 
     115                    continue 
     116 
    106117            rel_opts = f.rel.to._meta 
    107             if f.rel.to not in models.get_models(): 
    108                 e.add(opts, "'%s' has m2m relation with model %s, which has not been installed" % (f.name, rel_opts.object_name)) 
    109  
    110118            rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name() 
    111119            rel_query_name = f.related_query_name() 
  • django/trunk/django/db/models/options.py

    r6801 r6835  
    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 
     
    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(): 
  • django/trunk/tests/modeltests/invalid_models/models.py

    r6590 r6835  
    108108    colour = models.CharField(max_length=5) 
    109109    model = models.ForeignKey(Model) 
     110 
     111class MissingRelations(models.Model): 
     112    rel1 = models.ForeignKey("Rel1") 
     113    rel2 = models.ManyToManyField("Rel2") 
    110114 
    111115model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "max_length" attribute. 
     
    192196invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_3' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_3'. 
    193197invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_4' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_4'. 
     198invalid_models.missingrelations: 'rel2' has m2m relation with model Rel2, which has not been installed 
     199invalid_models.missingrelations: 'rel1' has relation with model Rel1, which has not been installed 
    194200"""