如何为Django Model字段创建别名?

Neo*_*ang 10 python database django

我的Django模型有一个名为'updatedOn'的日期时间字段,我需要在此模型上使用库函数来计算一些统计信息,但该函数假定日期时间字段名称为'时间',这是函数使用日期时间的方式:

c = qset.filter(time__year=tt.year, time__month=tt.month, time__day=tt.day).count();
Run Code Online (Sandbox Code Playgroud)

在不触及库代码的情况下,如何创建别名'time'来引用'updatedOn'字段,以便我可以使用该函数?

mii*_*kas 5

我没有对此进行深入研究,但是从直觉上讲,以下某些方法可能会让您入门。

海关经理

一个自定义的管理与改进的get_queryset方法来寻找updatedOn用于过滤的时候time

自定义字段类型

可以创建仅充当对另一个字段的引用的自定义字段类型

入侵模型._meta.fields

模型对象_meta.fields似乎包含该对象中的字段列表。也许您可以尝试添加一种称为的虚拟字段time,它指向该updatedOn字段。


rar*_*iru 5

这个旧的Django Snippet为我工作,直到 Django 1.11。正如@Jaberwocky 评论的那样virtual_onlyDjango 2.0 中被删除

但是,弃用警告显示该字段已弃用,以支持private_only,尽管在上述链接中删除的功能中并未提及这一点。

class AliasField(models.Field):
    # def contribute_to_class(self, cls, name, virtual_only=False):
    #       '''
    #           virtual_only is deprecated in favor of private_only
    #       '''
    #     super(AliasField, self).contribute_to_class(cls, name, virtual_only=True)
    #     setattr(cls, name, self)

    def contribute_to_class(self, cls, name, private_only=False):
        '''
            virtual_only is deprecated in favor of private_only
        '''
        super(AliasField, self).contribute_to_class(cls, name, private_only=True)
        setattr(cls, name, self)

    def __get__(self, instance, instance_type=None):
        return getattr(instance, self.db_column)


class Order(models.Model):
    """
    The main order model
    """
    number = AliasField(db_column='id')
Run Code Online (Sandbox Code Playgroud)

  • 振作起来。Django 2.0 摆脱了 virtual_only。 (2认同)

hel*_*ate 3

为模型中的字段创建属性:

class MyModel(moels.Model):
    updated_on = models.DateTimeField()

    def _get_time(self):
        return self.updated_on
    time = property(_get_time)
Run Code Online (Sandbox Code Playgroud)

  • 该属性可用于查询值,但不能在 qset.filter(time__year=tt.year...) 中使用。 (6认同)