Django ORM с полями UUID с использованием sqlite3 - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть несколько моделей со следующей структурой:

class Element(models.Model):
    api_id = models.UUIDField(null=False, blank=False, default=uuid.uuid4)
    ....

class Category(models.Model):
    api_id = models.UUIDField(null=False, blank=False, default=uuid.uuid4)
    ....

... и т. Д.

Затем я могу получить объекты из таблицы Element:

element = Element.objects.first()
element.api_id
UUID('8b278133-b8a2-4540-9dd0-129dd1394fcc')
Element.objects.filter(api_id='8b278133-b8a2-4540-9dd0-129dd1394fcc').count()
1

Пока все хорошо.Ошибка возникает, когда я делаю то же самое для таблицы Category:

category = Category.objects.first()
category.api_id
UUID('f63b5052-fba1-4ad1-a8ec-673efc673f44')
Category.objects.filter(api_id='f63b5052-fba1-4ad1-a8ec-673efc673f44').count()
0

То же самое происходит, если я преобразую строку в UUID:

Category.objects.filter(api_id=uuid.UUID('f63b5052-fba1-4ad1-a8ec-673efc673f44')).count()
0

Оба запроса преобразуютapi_id в целое число:

str(Element.objects.filter(api_id='8b278133-b8a2-4540-9dd0-129dd1394fcc').query)
SELECT ... FROM "element" WHERE "element"."api_id" = 8b278133b8a245409dd0129dd1394fcc

str(Category.objects.filter(api_id='f63b5052-fba1-4ad1-a8ec-673efc673f44').query)
SELECT ... FROM "category" WHERE "category"."api_id" = f63b5052fba14ad1a8ec673efc673f44

Обратите внимание, что запрос Element работает как ожидалось.

И в базе данных оба поля создаются как char (32):

CREATE TABLE "element" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "api_id" char(32) NOT NULL, ...)
CREATE TABLE "category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "api_id" char(32) NOT NULL, ...)

Итак, если все равны для всех таблиц, почему запросы Category ничего не находят по этому полю uuid?

Я использую Python 3.5, Django 2.0и SQLite 3. Я тестировал Postgres 9.5, и он работает, как и ожидалось.Это происходит только с SQLite3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...