Django

Code

Changeset 2767

Show
Ignore:
Timestamp:
04/28/06 12:59:37 (2 years ago)
Author:
lukeplant
Message:

magic-removal: Fixed #1705 - creating instances of models without supplying any keyword arguments.
(NB - diff is misleading - we need diff tools that support significant whitespace!)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/db/models/base.py

    r2672 r2767  
    8080    def __init__(self, *args, **kwargs): 
    8181        dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs) 
     82        for f in self._meta.fields: 
     83            if isinstance(f.rel, ManyToOneRel): 
     84                try: 
     85                    # Assume object instance was passed in. 
     86                    rel_obj = kwargs.pop(f.name) 
     87                except KeyError: 
     88                    try: 
     89                        # Object instance wasn't passed in -- must be an ID. 
     90                        val = kwargs.pop(f.attname) 
     91                    except KeyError: 
     92                        val = f.get_default() 
     93                else: 
     94                    # Object instance was passed in. 
     95                    # Special case: You can pass in "None" for related objects if it's allowed. 
     96                    if rel_obj is None and f.null: 
     97                        val = None 
     98                    else: 
     99                        try: 
     100                            val = getattr(rel_obj, f.rel.get_related_field().attname) 
     101                        except AttributeError: 
     102                            raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj)) 
     103                setattr(self, f.attname, val) 
     104            else: 
     105                val = kwargs.pop(f.attname, f.get_default()) 
     106                setattr(self, f.attname, val) 
    82107        if kwargs: 
    83             for f in self._meta.fields: 
    84                 if isinstance(f.rel, ManyToOneRel): 
    85                     try: 
    86                         # Assume object instance was passed in. 
    87                         rel_obj = kwargs.pop(f.name) 
    88                     except KeyError: 
    89                         try: 
    90                             # Object instance wasn't passed in -- must be an ID. 
    91                             val = kwargs.pop(f.attname) 
    92                         except KeyError: 
    93                             val = f.get_default() 
    94                     else: 
    95                         # Object instance was passed in. 
    96                         # Special case: You can pass in "None" for related objects if it's allowed. 
    97                         if rel_obj is None and f.null: 
    98                             val = None 
    99                         else: 
    100                             try: 
    101                                 val = getattr(rel_obj, f.rel.get_related_field().attname) 
    102                             except AttributeError: 
    103                                 raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj)) 
    104                     setattr(self, f.attname, val) 
    105                 else: 
    106                     val = kwargs.pop(f.attname, f.get_default()) 
    107                     setattr(self, f.attname, val) 
    108             if kwargs: 
    109                 raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] 
     108            raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] 
    110109        for i, arg in enumerate(args): 
    111110            setattr(self, self._meta.fields[i].attname, arg)