#29314: PostgreSQL error when using a TextField generic object ID field, an 
integer
PK, and GenericRelation
-------------------------------------+-------------------------------------
               Reporter:  Kye        |          Owner:  nobody
  Russell                            |
                   Type:  Bug        |         Status:  new
              Component:  Database   |        Version:  1.11
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:  orm, postgres
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 I'm still unsure if this is a Django bug or incorrect usage on my part, so
 please close this ticket if it's the latter.

 I have a fairly basic looking Django model with a generic relationship:


 {{{
 class AttachedMediaItem(models.Model):

     # Generic relation to another object.
     parent_content_type = models.ForeignKey(
         'contenttypes.ContentType',
         related_name='attachedmediaitem_parent_set',
 on_delete=models.CASCADE)
     parent_object_id = models.TextField(db_index=True)
     parent_content_object = GenericForeignKey('parent_content_type',
                                               'parent_object_id')
 }}}

 (irrelevant fields removed)

 I inherited this codebase so I cannot fully justify all design decisions,
 however I believe parent_object_id is a TextField to support non-integer
 PKs on the related object (e.g. UUIDs). This model tends to relate to a
 wide variety of other models, so it needs to be very versatile in terms of
 what PK types it supports.

 This is as-per the Django docs recommendations:
 
https://docs.djangoproject.com/en/2.0/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey

 Now, this model:


 {{{
 class UnitType(models.Model):

     media = GenericRelation('media.AttachedMediaItem',
                             content_type_field='parent_content_type',
                             object_id_field='parent_object_id')
 }}}

 (irrelevant fields removed).

 Note that I'm leaving the PK generation up to Django, meaning I'll get an
 integer PK for this model.

 Now, if I run this


 {{{
 UnitType.objects.filter(media__isnull=True)
 }}}

 An SQL error manages to bubble through the ORM:


 {{{
 ProgrammingError: operator does not exist: integer = text
 LINE 1: ...a_attachedmediaitem" ON ("products_unittype"."id" = "media_a...
                                                              ^
 HINT:  No operator matches the given name and argument type(s). You might
 need to add explicit type casts.
 }}}

 My understanding is that this is due to the difference in PK fields.

 I believe I have followed the prescribed best practice as per the Django
 documentation (relevant section linked above). I feel that at the very
 least this shouldn't result in a somewhat cryptic PostgreSQL error.

 Is this a genuine Django bug, or misuse on my part?

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29314>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/053.503c13e71204cd2b1788f44eb3f876dd%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to