Django 模型查询截断列的值
Django model query truncate column's value
我有一个这样定义的查询
SELECT DISTINCT substring(date::text from 1 for 8)||'000' AS date FROM my_table;
如何转换成Django模型?
date
是这样的20150403000
查询应该 return 20150403
没有尾随 000
我现在的情况是这样的:
query.distinct('date')
已编辑
好吧,这个问题含糊不清。我再次重新定义了我的问题,因为即使是 psql 也不能做我想做的事(在这里翻译丢失了)。哈哈
select to_date(CAST(date as TEXT), 'YYYYMMDD') from my_table
Where to_date(CAST(date as TEXT), 'YYYYMMDD')<=DATE '20141127' ;
date 是 bigint 类型。 django 模型 orm 可以处理这个吗?
您可以使用 Django 模型的 to_python
。
Converts a value as returned by your database (or a serializer) to a Python object.
例如:
class CustomDateTimeField(models.DateTimeField):
def to_python(self, value):
if isinstance(value, DateTimeField):
return value.rstrip("0")
然后您需要使用为您的模型归档的自定义日期时间。
说my_date = CustomDateTimeField()
还有,get_prep_value
,此方法用于将Python个对象转换为查询值。
更新:
对于带过滤器的查询,它会尝试实现 loopkup,因此您应该使用 get_prep_lookup
处理 loopkup
像这样:
def get_db_prep_value(self, value, *args, **kwargs):
if value is not None:
return datetime.datetime.strptime(value[0:4] + "-" + value[4:6] + "-" + value[6:], "%Y-%m%d")
def get_prep_lookup(self, lookup_type, value):
return self.get_db_prep_value(value)
示例:
from django.db import models
import datetime
# Create your models here.
class CustomDateTimeField(models.Field):
__metaclass__ = models.SubfieldBase
def db_type(self, connection):
return 'datetime'
def to_python(self, value):
if not value is None:
if isinstance(value, datetime.datetime):
return value.strftime("%Y-%m-%d")
else:
return value.rstrip("0")
def get_db_prep_value(self, value, *args, **kwargs):
if value is not None:
return datetime.datetime.strptime(value[0:4] + "-" + value[4:6] + "-" + value[6:], '%Y-%m-%d')
return None
def get_prep_lookup(self, lookup_type, value):
return self.get_db_prep_value(value.rstrip("0"))
class Person(models.Model):
name = models.CharField(max_length=25)
my_date = CustomDateTimeField()
我有一个这样定义的查询
SELECT DISTINCT substring(date::text from 1 for 8)||'000' AS date FROM my_table;
如何转换成Django模型?
date
是这样的20150403000
查询应该 return 20150403
没有尾随 000
我现在的情况是这样的:
query.distinct('date')
已编辑
好吧,这个问题含糊不清。我再次重新定义了我的问题,因为即使是 psql 也不能做我想做的事(在这里翻译丢失了)。哈哈
select to_date(CAST(date as TEXT), 'YYYYMMDD') from my_table
Where to_date(CAST(date as TEXT), 'YYYYMMDD')<=DATE '20141127' ;
date 是 bigint 类型。 django 模型 orm 可以处理这个吗?
您可以使用 Django 模型的 to_python
。
Converts a value as returned by your database (or a serializer) to a Python object.
例如:
class CustomDateTimeField(models.DateTimeField):
def to_python(self, value):
if isinstance(value, DateTimeField):
return value.rstrip("0")
然后您需要使用为您的模型归档的自定义日期时间。
说my_date = CustomDateTimeField()
还有,get_prep_value
,此方法用于将Python个对象转换为查询值。
更新: 对于带过滤器的查询,它会尝试实现 loopkup,因此您应该使用 get_prep_lookup
处理 loopkup像这样:
def get_db_prep_value(self, value, *args, **kwargs):
if value is not None:
return datetime.datetime.strptime(value[0:4] + "-" + value[4:6] + "-" + value[6:], "%Y-%m%d")
def get_prep_lookup(self, lookup_type, value):
return self.get_db_prep_value(value)
示例:
from django.db import models
import datetime
# Create your models here.
class CustomDateTimeField(models.Field):
__metaclass__ = models.SubfieldBase
def db_type(self, connection):
return 'datetime'
def to_python(self, value):
if not value is None:
if isinstance(value, datetime.datetime):
return value.strftime("%Y-%m-%d")
else:
return value.rstrip("0")
def get_db_prep_value(self, value, *args, **kwargs):
if value is not None:
return datetime.datetime.strptime(value[0:4] + "-" + value[4:6] + "-" + value[6:], '%Y-%m-%d')
return None
def get_prep_lookup(self, lookup_type, value):
return self.get_db_prep_value(value.rstrip("0"))
class Person(models.Model):
name = models.CharField(max_length=25)
my_date = CustomDateTimeField()