How To Create An Alias For Django Model Field?
Solution 1:
I haven't looked into this very deeply, but intuitively, some of the following ways might get you started.
Custom manager
A custom manager with a modified get_queryset
method to look for updatedOn
when filtering for time
.
Custom field type
It might be possible to create a custom field type which only acts as a reference to another field.
Hacking the model._meta.fields
The model object's _meta.fields
seems to contain the list of fields in that object. Maybe you could try adding some kind of dummy field called time
, which refers to the updatedOn
field.
Solution 2:
This old Django Snippet, worked for me, until Django 1.11. As @Jaberwocky commented virtual_only
gets removed in Django 2.0
However, the deprecation warning reads that this field is deprecated in favor of private_only
, although this is not mentioned in the features removed of the above link.
classAliasField(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)defcontribute_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):
returngetattr(instance, self.db_column)
classOrder(models.Model):
"""
The main order model
"""
number = AliasField(db_column='id')
Solution 3:
Create a property for the field in your model:
classMyModel(moels.Model):
updated_on = models.DateTimeField()
def_get_time(self):
return self.updated_on
time = property(_get_time)
Solution 4:
following miikkas's suggestion re model.Manager, I came up with the following that works for the much simpler case of retrieving the id field by querying uuid. the database was created with the ID being a varchar field used for a hexadecimal string, and I'm retrofitting a sequential integer ID field so I can use Django's auth module which requires it. and I want to do this in steps, hence the hack.
if DEVELOPMENT['merging_to_sequential_ids_incomplete']:
classModelManager(models.Manager):
defget(self, *args, **kwargs):
if'uuid'in kwargs:
kwargs['id'] = kwargs.pop('uuid')
returnsuper(ModelManager, self).get(*args, **kwargs)
classModel(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.uuidelse:
id = models.AutoField(primary_key = True)
uuid = models.CharField(max_length = 32, ...
now I can:
cd myapp && ../djangopython manage.py shell
WARNING: uuid now a synonym to id
setting up special admin settings
Python 2.7.8 (default, Nov 182014, 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
could be done the same way.
maybe this can help guide someone else looking for a way to use an "alias" or "synonym" for a Django model field. I don't believe it will help the OP though. the custom field type might be the better general approach.
Post a Comment for "How To Create An Alias For Django Model Field?"