Created
July 25, 2017 00:42
-
-
Save seanbehan/8a9b47a1bf5fb1a5e50b8c6ed849607b to your computer and use it in GitHub Desktop.
Django BaseModel ORM __repr__ Example Custom JSONEncoder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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