Django模型查询截断列的值

时间:2015-05-25 04:33:59

标签: django python-2.7 django-models

我有一个像这样定义的查询

SELECT DISTINCT substring(date::text from 1 for 8)||'000' AS date FROM my_table;

如何将其转换为Django模型?

date就像这样20150403000 该查询应该返回20150403而不会跟踪000

我现在拥有的是这样的:

query.distinct('date')

EDITED

好的问题很模糊。我再次重新定义了我的问题,因为即使psql也不能做我想要的东西(在这里丢失了)。 LOL

select to_date(CAST(date as TEXT), 'YYYYMMDD') from my_table
Where to_date(CAST(date as TEXT), 'YYYYMMDD')<=DATE '20141127' ;

日期属于bigint类型。 django模型orm可以处理这个吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Django模型&#39; 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()