Фильтрация UUID в Django

У меня следующая модель:

class MyModel(models.Models):
    uuid = models.UUIDField(default=uuid.uuid4, db_index=True, editable=False, unique=True)
    name = models.CharField(max_length=200)

В моей админке django у меня есть следующие поля поиска:

search_fields = ["uuid__exact", "name"]

Это должно переводиться в следующий запрос:

MyModel.objects.filter(Q(uuid__exact=query) | Q(name__icontains=query))

Однако при выполнении этого запроса возникает следующая ошибка:

ValidationError: ['“test name” is not a valid UUID.']

Как предотвратить, чтобы часть запроса, связанная с uuid, выдавала ошибку ValidationError? Я хочу иметь возможность искать мою модель либо по uuid, либо по полю name в django admin.

Что-то вроде этого должно помочь:

class Cast(Func):
function = "CAST"
template = "%(function)s(%(expressions)s AS varchar)"
Group.objects.annotate(sid=Cast(id)).filter(sid__startswith='000')

Я не уверен, что в UUIDFields можно осуществлять поиск. Вы можете сделать это, имея свойство или аннотированное поле в вашей модели, которое содержит строковое представление UUID.

Поскольку test name не является допустимым uuid. Поэтому вы можете проверить ваш query, является ли он допустимым uuid или нет, прежде чем использовать его в filter

Вы можете использовать try-except и если встречается ValueError, то фильтровать только по name, так как

import uuid

filtered_data = None
try:
    uuid = uuid.UUID(query)
    filtered_data  = MyModel.objects.filter(Q(uuid__exact=query) | Q(name__icontains=query))
except ValueError:
    filtered_data  = MyModel.objects.filter(Q(name__icontains=query))

    
Вернуться на верх