and curious why the change in this behavior vs using the db's native uuid 
type directly

On Thursday, May 5, 2022 at 7:27:02 AM UTC-4 Jason wrote:

> when you print the query executed, what is the difference between a 
> working query and the current one?
>
> On Wednesday, May 4, 2022 at 11:14:02 AM UTC-4 [email protected] wrote:
>
>> Hello Django users,
>>
>> I've recently upgraded the Django version from 2.2 to 3.2 in a project at 
>> work. In this project, we've been using a custom version of UUIDField since 
>> version 1.x without issues. The purpose of this field is to persist the 
>> full UUIDs with dashes into the database (MySQL char(36)).
>>
>> import uuid
>>
>> from django.db import models
>>
>>
>> class UUIDField(models.UUIDField):
>>     """
>>     Overrides Django UUIDField to store full UUID's including dashes.
>>     """
>>     def __init__(self, verbose_name=None, **kwargs):
>>         super().__init__(verbose_name, **kwargs)
>>         self.max_length = 36
>>
>>     def get_internal_type(self):
>>         return "CharField"
>>
>>     def get_db_prep_value(self, value, connection, prepared=False):
>>         if value is None:
>>             return None
>>         if not isinstance(value, uuid.UUID):
>>             try:
>>                 value = uuid.UUID(value)
>>             except AttributeError:
>>                 raise TypeError(self.error_messages['invalid'] % 
>> {'value': value})
>>
>>         if connection.features.has_native_uuid_field:
>>             return value
>>         return str(value)
>>
>> Now the problem introduced with 3.2 is that filtering by this field 
>> doesn't work properly. If I try to filter by a full UUID (with or without 
>> dashes) it returns an empty QuerySet. If I provide only one part of the 
>> UUID (i.e. one group of characters between the dashes) it works just fine.
>>
>> Python 3.6.9 (default, Mar 15 2022, 13:55:28)
>> [GCC 8.4.0] on linuxType "help", "copyright", "credits" or "license" for 
>> more information.
>> (InteractiveConsole)>>> from foobar.foo.models import Foo
>> >>>>>> Foo.objects.all()
>> <QuerySet [<Foo: Foo object (34c46fe8-caf0-11ec-bdb9-482ae362a4c0)>]>
>> >>>>>> Foo.objects.filter(id__icontains='34c46fe8-caf0-11ec-bdb9-482ae362a4c0')
>> <QuerySet []>
>> >>>>>> Foo.objects.filter(id__icontains='34c46fe8-')
>> <QuerySet [<Foo: Foo object (34c46fe8-caf0-11ec-bdb9-482ae362a4c0)>]>
>> >>>>>> Foo.objects.filter(id__icontains='34c46fe8-c')
>> <QuerySet []>
>> >>>
>>
>> Here's a little Github Gist 
>> <https://gist.github.com/milonoir/080ecfe1d0fa52df0a0c4a6ab265dde0> 
>> where I uploaded a simplified model.py and admin.py along with the 
>> UUIDField. This is what I used above in the python shell. Any help would be 
>> appreciated, I couldn't figure out how to fix it.
>>
>> (PS: I also raised this in StackOverflow 
>> <https://stackoverflow.com/questions/72101751/filtering-by-custom-uuidfield-got-broken-with-django-3-2-upgrade>
>>  
>> just in case you came across with it.)
>>
>> Cheers,
>> Milan
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" 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-users/1766da19-69ca-461f-8a50-908118f18d33n%40googlegroups.com.

Reply via email to