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.

Reply via email to