AFAIK, 'dashes' in a character based persisted UUID is divergent behavior. UUID are 128 bits wide, apportioned by nibble into a character field, 32 at most. So... The migration is yours to correct. Good luck, good hunting, HTH.
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/cdd244e4-f73f-4cfb-a7cc-0e4fdc130a82n%40googlegroups.com.

