2010/10/14 Jonathan Barratt <jonathan.barr...@knifeict.com> > On 14 ?.?. 2010, at 22:27, Marc Aymerich wrote: > > Hi, > I'm trying to make a Manager for my model "order". I want that it returns > all orders that their 'active period'* is greater than a certain threshold. > With "active period" I mean: (order.cancel_date - order.register_date ) > > My Order model looks like this: > > class order(models.Model): > register_date = models.DateTimeField(auto_now_add=True) > cancel_date = models.DateTimeField(null=True, blank=True) > > > I'm wondering if is possible to achieve that using "annotate", something > like that: > (this not work) > > order.objects.annotate(diff=SUB('cancel_date','register_date')).filter(diff__gt=period_threshold) > > > or maybe django provides another kind of tool to achieve what i want ? > > > Unless I'm misunderstanding what you're looking for, I think this might > suit your needs: > > in your model: > > class order(models.Model): > > ... > def get_active_period(self): return self.cancel_date - > self.register_date active_period = property(get_active_period) > (you may want to add some checking that cancel_date is not null, or that > active_period is not negative but you get the idea) > > Then where you need to access that queryset use: > > order.objects.filter(active_period__gt=period_threshold) > > jops ;(, unfortunately the Manager doesn't know what "active_period" is.
This is my order model now: class order(models.Model): [...] def get_active_period(self): if self.cancel_date: return self.cancel_date-self.register_date else: return datetime.datetime.now()-self.register_date active_period = property(get_active_period) objects = models.Manager() pending_of_bill = pending_of_billManager() And this is my manager: class pending_of_billManager(models.Manager): def get_query_set(self): [...] return super(pending_of_billManager, self).get_query_set().filter(active_period__gt=threshold) This Works: >>> order.objects.get(pk=1).active_period datetime.timedelta(0, 8347, 24949) but this doesn't: >>> order.pending_of_bill.all() Traceback (most recent call last): File "<console>", line 1, in <module> File "/usr/lib/python2.6/dist-packages/django/db/models/manager.py", line 117, in all return self.get_query_set() File "/home/ucp/trunk/ucp/../ucp/order/models.py", line 15, in get_query_set return super(pending_of_billManager, self).get_query_set().filter(active_period__gt=threshold) File "/usr/lib/python2.6/dist-packages/django/db/models/query.py", line 549, in filter return self._filter_or_exclude(False, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/db/models/query.py", line 567, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs)) File "/usr/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1128, in add_q can_reuse=used_aliases) File "/usr/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1026, in add_filter negate=negate, process_extras=process_extras) File "/usr/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1191, in setup_joins "Choices are: %s" % (name, ", ".join(names))) FieldError: Cannot resolve keyword 'active_period' into field. Choices are: amendment_invoice, amendment_quota, bill, cancel_date, comment, contracted_pack, discount, entity, forward, htacces, htpasswd, id, included, installed_app, mailman, name, order_disk, order_memory, order_swap, ovz, pack, price, register_date, renew, service, size, system_group, system_user, system_user_related, traffic, virtual_aliase, virtual_user, virtual_user_related, virtualhost What I'm missing ?? why super(pending_of_billManager, self).get_query_set() doesn't know about active_period? Thanks! -- Marc -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.