Timestamp fields in django

前端 未结 4 1224
谎友^
谎友^ 2020-12-16 12:57

I have a MySQL database, right now I\'m generating all of the datetime fields as models.DateTimeField. Is there a way to get a timestamp instead? I

相关标签:
4条回答
  • 2020-12-16 13:06

    There was actually a very good and informative article on this. Here: http://ianrolfe.livejournal.com/36017.html

    The solution on the page is slightly deprecated, so I did the following:

    from django.db import models
    from datetime import datetime
    from time import strftime
    
    class UnixTimestampField(models.DateTimeField):
        """UnixTimestampField: creates a DateTimeField that is represented on the
        database as a TIMESTAMP field rather than the usual DATETIME field.
        """
        def __init__(self, null=False, blank=False, **kwargs):
            super(UnixTimestampField, self).__init__(**kwargs)
            # default for TIMESTAMP is NOT NULL unlike most fields, so we have to
            # cheat a little:
            self.blank, self.isnull = blank, null
            self.null = True # To prevent the framework from shoving in "not null".
    
        def db_type(self, connection):
            typ=['TIMESTAMP']
            # See above!
            if self.isnull:
                typ += ['NULL']
            if self.auto_created:
                typ += ['default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP']
            return ' '.join(typ)
    
        def to_python(self, value):
            if isinstance(value, int):
                return datetime.fromtimestamp(value)
            else:
                return models.DateTimeField.to_python(self, value)
    
        def get_db_prep_value(self, value, connection, prepared=False):
            if value==None:
                return None
            # Use '%Y%m%d%H%M%S' for MySQL < 4.1
            return strftime('%Y-%m-%d %H:%M:%S',value.timetuple())
    

    To use it, all you have to do is: timestamp = UnixTimestampField(auto_created=True)

    In MySQL, the column should appear as: 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    Only drawback with this is that it only works on MySQL databases. But you can easily modify it for others.

    0 讨论(0)
  • 2020-12-16 13:06

    The pip package django-unixdatetimefield provides a UnixDateTimeField field that you can use for this out of the box (https://pypi.python.org/pypi/django-unixdatetimefield/).

    Example model:

    from django_unixdatetimefield import UnixDateTimeField
    
    class MyModel(models.Model):
        created_at = UnixDateTimeField()
    

    Python ORM query:

    >>> m = MyModel()
    >>> m.created_at = datetime.datetime(2015, 2, 21, 19, 38, 32, 209148)
    >>> m.save()
    

    Database:

    sqlite> select created_at from mymodel;
    1426967129
    

    Here's the source code if interested - https://github.com/Niklas9/django-unixdatetimefield.

    Disclaimer: I'm the author of this pip package.

    0 讨论(0)
  • 2020-12-16 13:13

    To automatically update on insert and update use this:

    created = DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
    last_modified = DateTimeField(auto_now=True, editable=False, null=False, blank=False)
    

    The DateTimeField should store UTC (check your DB settings, I know from Postgres that there it is the case). You can use l10n in the templates and format via:

    {{ object.created|date:'SHORT_DATETIME_FORMAT' }}
    

    Seconds since Unix Epoch:

    {{ object.created|date:'U' }}
    

    See https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#date

    0 讨论(0)
  • 2020-12-16 13:20

    django-extensions has a useful TimeStampedModel: https://django-extensions.readthedocs.io/en/latest/model_extensions.html

    0 讨论(0)
提交回复
热议问题