I think you can only achieve that currently by using queryset extra()
method.

You should open a ticket and preferably create a standard geodjango
testcase for that. It could be also possible that not all gis backends
support that kind of a behavior.

On Sat, Mar 3, 2012 at 6:47 PM, Daniel Gerzo <dge...@gmail.com> wrote:

> Hello guys,
>
> I have an Order model, that has an origin PointField and a range
> IntegerField. Furthermore, there is an UserProfile model, which has a
> geo_location PointField. Now, I have an User instance, user. I want to
> select all Orders, whose distance between Order.origin and
> user.userprofile.geo_location is less then the value (meters) in the
> Order.range model field.
>
> So again, simplified models:
>
> class Order(models.Model):
>    origin = models.PointField()
>    range = models.IntegerField(blank=**True, default=10000)
>
> class UserProfile(models.Model):
>    geo_location = models.PointField()
>
>
> I've got this working (passing the distance statically):
>
> >>> Order.objects.filter(origin__**distance_lte=(user.profile.**geo_location,
> D(m=3000)))
>
> My next (unsuccessful) try was to use an F() expression to use the value
> from the Order.range field:
>
> >>> Order.objects.filter(origin__**distance_lte=(user.profile.**geo_location,
> D(m=F('range'))))
> Traceback (most recent call last):
>  File "<console>", line 1, in <module>
>  File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/**contrib/gis/measure.py", line 165, in __init__
> self.m, self._default_unit = self.default_units(kwargs)
>  File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/**contrib/gis/measure.py", line 49, in
> default_units
> if not isinstance(value, float): value = float(value)
>  TypeError: float() argument must be a string or a number
> I think the problem is that the D() isn't ran lazily - I can understand
> that. So I tried to just take the raw value from the range field (integer)
> which I supposed to work, but:
>
> >>> Order.objects.filter(origin__**distance_lte=(user.profile.**geo_location,
> F('range')))
> Traceback (most recent call last):
> File "<console>", line 1, in <module>
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/query.py", line 69, in __repr__
> data = list(self[:REPR_OUTPUT_SIZE + 1])
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/query.py", line 84, in __len__
> self._result_cache.extend(**self._iter)
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/query.py", line 273, in iterator
> for row in compiler.results_iter():
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/sql/compiler.py", line 680, in
> results_iter
> for rows in self.execute_sql(MULTI):
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/sql/compiler.py", line 725, in
> execute_sql
> sql, params = self.as_sql()
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/sql/compiler.py", line 68, in as_sql
> where, w_params = self.query.where.as_sql(qn=qn,
> connection=self.connection)
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/sql/where.py", line 92, in as_sql
> sql, params = child.as_sql(qn=qn, connection=connection)
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/db/**models/sql/where.py", line 95, in as_sql
> sql, params = self.make_atom(child, qn, connection)
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/**contrib/gis/db/models/sql/**where.py", line 47,
> in make_atom
> spatial_sql = connection.ops.spatial_lookup_**sql(data, lookup_type,
> params_or_value, lvalue.field, qn)
> File "/Users/danger/devel/.**virtualenvs/proj/lib/python2.**
> 7/site-packages/django/**contrib/gis/db/backends/**postgis/operations.py",
> line 531, in spatial_lookup_sql
> raise ValueError('Argument type should be %s, got %s instead.' %
> (arg_type, type(value[1])))
> ValueError: Argument type should be (<class 'decimal.Decimal'>, <class
> 'django.contrib.gis.measure.**Distance'>, <type 'float'>, <type 'int'>,
> <type 'long'>), got <class 'django.db.models.expressions.**F'> instead.
>
> So how can I accomplish what I am trying to? Any help is appreciated!
>
> PS: I have posted this also to StackOverflow at
> http://stackoverflow.com/q/**9547069/755532?sem=2<http://stackoverflow.com/q/9547069/755532?sem=2>
>
> Thanks in advance!
>
> --
> Kind regards
>  Daniel
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To post to this group, send email to django-users@googlegroups.com.
> To unsubscribe from this group, send email to django-users+unsubscribe@**
> googlegroups.com <django-users%2bunsubscr...@googlegroups.com>.
> For more options, visit this group at http://groups.google.com/**
> group/django-users?hl=en<http://groups.google.com/group/django-users?hl=en>
> .
>
>
-- 

Jani Tiainen

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@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