Django dumpdata записывает дату и время как нули
У меня есть база данных Django (sqlite), которая содержит мои модели. В частности, есть одна модель с полем даты, которое не является нулевым в базе данных (подтверждено с помощью оболочки sqlite), которую dumpdata всегда сериализует как нулевое.
Я использую django 1.4.5 под python 2.7.5.
Часть, которая действительно странна, состоит в том, что это не делает это для всех полей даты. Кажется, это единственное поле, которое имеет вид datetime
в базе данных, а не просто date
,
У меня вопрос: что это вызывает и как я могу это остановить? Или, в качестве альтернативы, что является хорошей альтернативой dumpdata?
Вот код модели:
class AccountTransaction(models.Model):
value = models.FloatField()
description = models.CharField(max_length = 1000)
credit_in = models.ForeignKey(Organisation, on_delete = models.PROTECT, related_name='credits_in')
debit_in = models.ForeignKey(Organisation, on_delete = models.PROTECT, related_name='debits_in')
date = models.DateTimeField(auto_now_add=True)
class Meta:
get_latest_by = 'date'
Вот схема:
CREATE TABLE "mainapp_accounttransaction"
("credit_in_id" integer,
"description" varchar(1000),
"date" datetime NOT NULL DEFAULT '2012-06-18',
"debit_in_id" integer,
"id" integer PRIMARY KEY,
"value" real);
И вот пример экземпляра, неправильно сериализованного с нулевой датой:
{
"pk": 1,
"model": "mainapp.accounttransaction",
"fields": {
"debit_in": 1,
"date": null,
"credit_in": 1,
"description": "Charge for standard of Example5-1 limited (order Incorporation Order no. 13 for Example5-1 limited (UK Company temporary number: UN177efa40-2022-11e1-b383-e89a8f7f9c14))",
"value": 100.0
}
}
Для сравнения, вот результат поиска в базе данных:
sqlite> select * from mainapp_accounttransaction where id is 1;
1|Charge for standard of Example5-1 limited (order Incorporation Order no. 13 for Example5-1 limited (UK Company temporary number: UN177efa40-2022-11e1-b383-e89a8f7f9c14))|2012-06-18|1|1|100.0
Обновление: вот забавная вещь:
>>> import mainapp.models
>>> ats = mainapp.models.AccountTransaction.objects.all()
>>> [o.date for o in ats]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
1 ответ
Оказывается, sqlite обрабатывает значения по умолчанию странным образом. С использованием sqlite3
ракушка, select
извлекает строки со значением по умолчанию, но Django ORM извлекает None
значения, потому что кажется, что отдельные значения не были установлены ни для одного из этих объектов.
Решением было установить значения через ORM для каждого объекта.