Django dumpdata сериализация int как строки

Я пытался сделать пользовательский класс/тип, определенный в отдельном db.py файле, чтобы он правильно сериализовался как int при выполнении команды manage.py dumpdata, но это поле BitFlagField всегда экспортируется как строка, значение которой сопровождается двойными кавычками, в то время как другие целочисленные поля правильно экспортируются без кавычек в JSON-файл. Человек, который сделал это, ушел почти год назад, так что я не могу получить от него никакой помощи

Вот код класса - обратите внимание, что я исправил функцию __str__, а также изменил __repr__ на return repr(self.value)

Вот как это выглядит после dumpdata: (...), "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'

Если я вручную убираю кавычки из значения поля "blocked", команда loaddata работает.

Если я удаляю обе функции __str__ и __repr__, то в качестве данных в итоге оказывается тип объекта: (...), "blocked": "<core.db.BitFlag object at 0x7f9f2eb0bf40>"}}. Если я заставлю одну из них возвращать self.value, она пожалуется, что ожидала тип str.

Мне нужно либо сохранить это значение как int в JSON, что мне пока не удалось, либо десериализовать его где-то, но я не могу понять часть where, поскольку, по моему мнению, это должно быть просто return int(self.value).

Поговорив с разными коллегами, один из них нашел проблему. Классу BitFlagField требовалась следующая функция

def value_to_string(self, obj):
    value = self.value_from_object(obj)
    return self.get_prep_value(value)

Добавление этого параметра заставило dumpdata работать, как и предполагалось, с полем, экспортируемым как int.

" Это было в документации все это время" - Правда, и я не уверен, как я это пропустил.

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