#31967: Resolving an output_field for mixed types crashes in database functions.
-------------------------------------+-------------------------------------
     Reporter:  Matt Hegarty         |                    Owner:  Hasan
                                     |  Ramezani
         Type:  Bug                  |                   Status:  closed
    Component:  Documentation        |                  Version:  dev
     Severity:  Normal               |               Resolution:  fixed
     Keywords:                       |             Triage Stage:  Ready for
                                     |  checkin
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by retpolanne):

 Hello! I see that this is fixed, but I still don't understand how to
 workaround this issue.

 I'm working on updating a Django app using this library:
 https://github.com/annemacedo-tw/django-spillway

 I get this error when using it:

 {{{
 django.core.exceptions.FieldError: Expression contains mixed types:
 MultiPolygonField, FloatField. You must set output_field.
 }}}

 However I don't get the same error on Django 3.1

 As far as I debugged, this line here yields these two fields
 https://github.com/annemacedo-tw/django-
 spillway/blob/fa008ef0db5f3434c1ef438f66231f35a90b1e6d/spillway/query.py#L153

 {{{
 SimplifyPreserveTopology(F(geometry), Value(0.0439453125))
 }}}

 The first one being a MultiPolygonField and the other one being a
 FloatField. I tried setting the output_field and recreating the
 source_expressions but it didn't really work.

 {{{
         sql = SimplifyPreserveTopology(sql, tilew)
         sql_field = sql.source_expressions[0]
         sql_value = sql.source_expressions[1]
         sql_value.output_field = models.MultiPolygonField()
         sql.set_source_expressions([sql_field, sql_value])
 }}}

 (I understand that I'm setting an output field for MultiPolygonField here
 instead of FloatField as should be expected, I set it up to avoid the
 mixed types error)

 {{{
   File "/usr/local/lib/python3.9/site-
 packages/django/contrib/gis/db/models/fields.py", line 194, in
 get_prep_value
     raise ValueError('Cannot use object with type %s for a spatial lookup
 parameter.' % type(obj).__name__)
 ValueError: Cannot use object with type float for a spatial lookup
 parameter.
 }}}


 TL;DR how can I work around this issue when using GeoDjango?

 Another thing I noticed is that ever since GeoManager was deprecated way
 back in 1.10, django.contrib.gis.db.models.FloatField resolves to
 django.db.models.fields.FloatField. I wonder if the gis FloatField would
 play nicely with MultiPolygonField.

 {{{
 (Pdb) from django.contrib.gis.db import models
 (Pdb) models.FloatField
 <class 'django.db.models.fields.FloatField'>
 }}}

 I wish I could open a separate ticket for this, but I'm working on legacy
 code that I don't understand so well, so I don't know how to do a minimal
 version out of it.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31967#comment:13>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018aad698149-c724498e-8064-457e-a88a-13856949cb0f-000000%40eu-central-1.amazonses.com.

Reply via email to