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.