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
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+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.