Skip to content

Instantly share code, notes, and snippets.

@seanbehan
Created July 25, 2017 00:42
Show Gist options
  • Save seanbehan/8a9b47a1bf5fb1a5e50b8c6ed849607b to your computer and use it in GitHub Desktop.
Save seanbehan/8a9b47a1bf5fb1a5e50b8c6ed849607b to your computer and use it in GitHub Desktop.
Django BaseModel ORM __repr__ Example Custom JSONEncoder
import json, re
import dateparser
from django.db import models
from django.forms.models import model_to_dict
from uuid import uuid4, UUID
from datetime import date, datetime
from django.template.defaultfilters import slugify
class ModelEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, UUID):
return str(obj)
if isinstance(obj, (datetime, date)):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
class BaseModel(models.Model):
uuid = models.UUIDField(default=uuid4)
created_at = models.DateTimeField(auto_now_add=True, null=True)
updated_at = models.DateTimeField(auto_now=True, null=True)
@property
def attributes(self):
return model_to_dict(self)
def save(self, *args, **kwargs):
if hasattr(self, 'slug') and hasattr(self, 'slug_property'):
self.slug = slugify(self.slug_property)
super(BaseModel, self).save(*args, **kwargs)
def __repr__(self):
return json.dumps(self.attributes, cls=ModelEncoder, indent=4)
class Meta:
abstract = True
class User(BaseModel):
name = models.CharField(max_length=255, null=True)
email = models.EmailField()
password = models.CharField(max_length=255, null=True)
class Event(BaseModel):
title = models.CharField(max_length=255, null=True)
slug = models.SlugField(unique=True, blank=True)
description = models.TextField(null=True)
location = models.CharField(max_length=255, null=True)
start = models.DateTimeField(null=True)
stop = models.DateTimeField(null=True)
def save(self, *args, **kwargs):
self.start = dateparser.parse(self.__dict__['start'])
self.stop = dateparser.parse(self.__dict__['stop'])
super(Event, self).save(*args, **kwargs)
@property
def slug_property(self):
return self.title
class Ticket(BaseModel):
event = models.ForeignKey(Event, related_name='tickets')
name = models.CharField(max_length=255, null=True)
price = models.FloatField(null=True)
def save(self, *args, **kwargs):
self.price = float(re.sub(r'[^0-9\.]', '', self.price or '') or 0.0)
super(Ticket, self).save(*args, **kwargs)
@property
def slug_property(self):
return self.name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment