Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Timestamp fields in django

Tags:

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 want to be able to autoupdate on create and update etc.

The documentation on django doesn't have this?

like image 453
KVISH Avatar asked Jul 04 '12 15:07

KVISH


People also ask

Is there a time field in Django?

TimeField is a time field which stores time, represented in Python by a datetime. time instance. As the name suggests, this field is used to store an object of datetime created in python.

What are fields in Django?

Fields in Django are the data types to store a particular type of data. For example, to store an integer, IntegerField would be used. These fields have in-built validation for a particular data type, that is you can not store “abc” in an IntegerField.

What is slug field in Django?

What is SlugField in Django? It is a way of generating a valid URL, generally using data already obtained. For instance, using the title of an article to generate a URL. Let's assume our blog have a post with the title 'The Django book by Geeksforgeeks' with primary key id= 2.


1 Answers

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.

like image 112
KVISH Avatar answered Oct 21 '22 12:10

KVISH