Django

Code

Changeset 8455

Show
Ignore:
Timestamp:
08/20/08 17:38:15 (11 months ago)
Author:
mtredinnick
Message:

Made it possible to pickle DateQuerySets?.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/query.py

    r8398 r8455  
    453453        assert order in ('ASC', 'DESC'), \ 
    454454                "'order' must be either 'ASC' or 'DESC'." 
    455         # Let the FieldDoesNotExist exception propagate. 
    456         field = self.model._meta.get_field(field_name, many_to_many=False) 
    457         assert isinstance(field, DateField), "%r isn't a DateField." \ 
    458                 % field_name 
    459         return self._clone(klass=DateQuerySet, setup=True, _field=field, 
    460                 _kind=kind, _order=order) 
     455        return self._clone(klass=DateQuerySet, setup=True, 
     456                _field_name=field_name, _kind=kind, _order=order) 
    461457 
    462458    def none(self): 
     
    722718        self.query = self.query.clone(klass=sql.DateQuery, setup=True) 
    723719        self.query.select = [] 
    724         self.query.add_date_select(self._field, self._kind, self._order) 
    725         if self._field.null: 
    726             self.query.add_filter(('%s__isnull' % self._field.name, False)) 
     720        field = self.model._meta.get_field(self._field_name, many_to_many=False) 
     721        assert isinstance(field, DateField), "%r isn't a DateField." \ 
     722                % field_name 
     723        self.query.add_date_select(field, self._kind, self._order) 
     724        if field.null: 
     725            self.query.add_filter(('%s__isnull' % field.name, False)) 
    727726 
    728727    def _clone(self, klass=None, setup=False, **kwargs): 
    729728        c = super(DateQuerySet, self)._clone(klass, False, **kwargs) 
    730         c._field = self._field 
     729        c._field_name = self._field_name 
    731730        c._kind = self._kind 
    732731        if setup and hasattr(c, '_setup_query'): 
  • django/trunk/django/db/models/sql/datastructures.py

    r7477 r8455  
    8686        self.col = col 
    8787        self.lookup_type = lookup_type 
    88         self.date_sql_func= date_sql_func 
     88        self.date_sql_func = date_sql_func 
    8989 
    9090    def relabel_aliases(self, change_map): 
  • django/trunk/django/db/models/sql/subqueries.py

    r8267 r8455  
    344344    back to Python objects, so we put it in a separate class. 
    345345    """ 
     346    def __getstate__(self): 
     347        """ 
     348        Special DateQuery-specific pickle handling. 
     349        """ 
     350        for elt in self.select: 
     351            if isinstance(elt, Date): 
     352                # Eliminate a method reference that can't be pickled. The 
     353                # __setstate__ method restores this. 
     354                elt.date_sql_func = None 
     355        return super(DateQuery, self).__getstate__() 
     356 
     357    def __setstate__(self, obj_dict): 
     358        super(DateQuery, self).__setstate__(obj_dict) 
     359        for elt in self.select: 
     360            if isinstance(elt, Date): 
     361                self.date_sql_func = self.connection.ops.date_trunc_sql 
     362 
    346363    def results_iter(self): 
    347364        """ 
  • django/trunk/tests/regressiontests/queries/models.py

    r8413 r8455  
    898898[<ExtraInfo: e1>] 
    899899 
     900Pickling of DateQuerySets used to fail 
     901>>> qs = Item.objects.dates('created', 'month') 
     902>>> _ = pickle.loads(pickle.dumps(qs)) 
     903 
    900904"""} 
    901905