Я пытался создать пользовательский класс/тип, определенный в отдельном файле db.py, для правильной сериализации как int при выполнении команды manage.py dumpdata
, но этот BitFlagField всегда заканчивается экспортом в виде строки, значение которой заключено в двойные кавычки. , в то время как другие целочисленные поля правильно экспортируются без кавычек в файле JSON. Человек, который сделал это, покинул это место почти год назад, поэтому я не могу получить от него никакой помощи.
Это код класса — обратите внимание, что я исправил функцию __str__
, а также изменил __repr__
на return repr(self.value)
Вот как это выглядит после дампа данных: (...), "blocked": "8"}}
; Для сравнения, в двух других целочисленных полях значение не заключено в кавычки: "pk": 1, "bit":8,
. Из-за этого manage.py loaddata
терпит неудачу:
django.core.serializers.base.DeserializationError: Problem installing fixture '/home/abcd/djangoapp/data.json': '>=' not supported between instances of 'str' and 'int': (core.userextra:pk=1) field_value was '8'
Если я вручную удалю кавычки из значения поля "заблокирован", команда loaddata сработает.
Если я удалю обе функции __str__
и __repr__
, тип объекта — это то, что в конечном итоге станет данными: (...), "blocked": "<core.db.BitFlag object at 0x7f9f2eb0bf40>"}}
. Если я заставлю любой из них вернуть self.value
, он жалуется, что ожидал тип str.
Что мне нужно, так это либо сохранить это значение как int в JSON, что до сих пор мне не удалось, либо десериализовать его где-нибудь, но я не могу понять часть куда, так как, на мой взгляд, это должно будь простым return int(self.value)
.
Поговорив с разными коллегами, один из них обнаружил проблему. Классу BitFlagField
нужна была следующая функция
def value_to_string(self, obj):
value = self.value_from_object(obj)
return self.get_prep_value(value)
После его добавления данные дампа работали должным образом, а поле экспортировалось как целое число.
«Это было в документах все время» — правда, и я не знаю, как я это пропустил.