我的Django模型有一个名为'updatedOn'的日期时间字段,我需要在这个模型上使用库函数来计算一些统计数据,但是该函数假设datetime字段名称为'time',这里是函数的使用方法日期时间:
c = qset.filter(time__year=tt.year, time__month=tt.month, time__day=tt.day).count();
如果不触及库代码,如何创建别名'time'来引用'updatedOn'字段,以便我可以使用该函数?
答案 0 :(得分:5)
我没有深入研究过这个问题,但直观地说,以下一些方法可能会让你开始。
使用修改后的get_queryset
方法的custom manager,以便在过滤updatedOn
时查找time
。
有可能创建一个custom field type,它只作为对另一个字段的引用。
模型对象的_meta.fields
似乎包含该对象中的字段列表。也许您可以尝试添加某种称为time
的虚拟字段,该字段引用updatedOn
字段。
答案 1 :(得分:2)
为模型中的字段创建属性:
class MyModel(moels.Model):
updated_on = models.DateTimeField()
def _get_time(self):
return self.updated_on
time = property(_get_time)
答案 2 :(得分:2)
这个古老的Django Snippet为我工作,直到Django 1.11。由于@Jaberwocky在Django 2.0
中删除了评论virtual_only
但是,deprecation warning会读取此字段已弃用in favor of 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')
答案 3 :(得分:1)
遵循miikkas的建议re model.Manager,我提出了以下内容,它适用于通过查询uuid来检索id字段的更简单的情况。数据库是使用ID作为用于十六进制字符串的varchar字段创建的,并且我正在改进顺序整数ID字段,因此我可以使用需要它的Django的auth模块。我想分步进行,因此黑客攻击。
if DEVELOPMENT['merging_to_sequential_ids_incomplete']:
class ModelManager(models.Manager):
def get(self, *args, **kwargs):
if 'uuid' in kwargs:
kwargs['id'] = kwargs.pop('uuid')
return super(ModelManager, self).get(*args, **kwargs)
class Model(models.Model):
if DEVELOPMENT['merging_to_sequential_ids_incomplete']:
print >>sys.stderr, 'WARNING: uuid now a synonym to id'
id = models.CharField(max_length = 32,
primary_key = True, default = uuid_string)
objects = ModelManager() # for Client.objects.get(uuid=...)
uuid = property(lambda self: self.id) # for client.uuid
else:
id = models.AutoField(primary_key = True)
uuid = models.CharField(max_length = 32, ...
现在我可以:
cd myapp && ../djangopython manage.py shell
WARNING: uuid now a synonym to id
setting up special admin settings
Python 2.7.8 (default, Nov 18 2014, 16:29:10)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from myapp.models import *
>>> Client.objects.get(uuid=u'18b86bd7b58e4c0186f7654045ce81d9')
<Client: jc@example.net>
>>> _.uuid
u'18b86bd7b58e4c0186f7654045ce81d9'
filter
可以用同样的方式完成。
也许这可以帮助引导其他人寻找使用&#34;别名&#34;或&#34;同义词&#34;对于Django模型字段。我不相信它会对OP有所帮助。自定义字段类型可能是更好的通用方法。