首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免ProgrammingError:在将Django模型实例保存到远程数据库时无法调整'DateTimeRangeField‘类型?

如何避免ProgrammingError:在将Django模型实例保存到远程数据库时无法调整'DateTimeRangeField‘类型?
EN

Stack Overflow用户
提问于 2015-07-05 02:09:16
回答 1查看 18.9K关注 0票数 6

我有一个包含DateTimeRangeField的模型,如https://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/#defining-your-own-range-types中所描述的,请参见下面的内容:

models.py

代码语言:javascript
复制
from django.db import models
from django.contrib.postgres.fields import DateTimeRangeField, RangeField

class ReportPeriod(models.Model):
  id = models.IntegerField(primary_key=True)
  period_name = models.TextField(blank=True)
  active_range = DateTimeRangeField(blank=True) 
  class Meta:
    managed = False
    db_table = 'report_period'

当我使用它查询远程数据库时,模型工作得很好(例如,ReportPeriod.objects.using('remote_db').filter(id='1',active_range__contains=datetime.now())返回预期的QuerySet)。

但是,当我试图在我的视图或shell中保存一个新的ReportPeriod时,我会得到一个ProgrammingError: can't adapt type 'DateTimeRangeField'。下面是我在获得错误之前在shell中遵循的步骤:

代码语言:javascript
复制
new_period = ReportPeriod(id=1,period_name = 'morning',active_range = DateTimeRangeField(datetime(2015,1,1,0,0,0),datetime(2016,1,1,0,0,0)))
new_period.save(using='remote_db')

这是整个错误跟踪:

代码语言:javascript
复制
Traceback (most recent call last):
 File "<console>", line 1, in <module>
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/base.py", line 710, in save
force_update=force_update, update_fields=update_fields)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/base.py", line 738, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/base.py", line 803, in _save_table
forced_update)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/base.py", line 853, in _do_update
return filtered._update(values) > 0
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/query.py", line 580, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1062, in execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
cursor.execute(sql, params)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
 File "~/.virtualenvs/mve/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
ProgrammingError: can't adapt type 'DateTimeRangeField'

我在模型定义中遗漏了什么吗?有人知道如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 11:21:33

DateTimeRangeField是字段类,应该仅用于模型定义。若要创建具有日期范围的对象,应使用来自DateTimeRangepsycopg2.extras类。

代码语言:javascript
复制
from psycopg2.extras import DateTimeRange

new_period = ReportPeriod(
    id=1,
    period_name='morning',
    active_range=DateTimeRange(datetime(2015, 1, 1, 0, 0, 0), datetime(2016, 1, 1, 0, 0, 0))
)
new_period.save(using='remote_db')

django.contrib.postgres文档中没有很好的文档,只显示了NumericRange,但我找到了这个用法示例在DateTimeRangeField测试中

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31226625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档