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()