本文介绍,Django中的Model的继承和如何操作数据。
参考
http://charlesleifer.com/blog/django-patterns-model-inheritance/
https://godjango.com/blog/django-abstract-base-class-multi-table-inheritance/
例1.继承 创建 数据
import datetime
from django.db import models, IntegrityError, transaction
from django.template.defaultfilters import slugify
class TitleSlugModel(models.Model):
# everything the same as above
def save(self, *args, **kwargs):
print 'title slug model save() called'
# ... same as above except adding a "print" statement at the top
# of the method
class DateAwareModel(models.Model):
pub_date = models.DateTimeField()
modified_date = models.DateTimeField()
created_date = models.DateTimeField()
class Meta:
abstract = True
def save(self, *args, **kwargs):
print 'date aware model save() called'
if not self.pk:
self.created_date = datetime.datetime.now()
self.modified_date = datetime.datetime.now()
return super(DateAwareModel, self).save(*args, **kwargs)
class ContentObject(TitleSlugModel, DateAwareModel):
content = models.TextField()
def save(self, *args, **kwargs):
print 'content model save() called'
super(ContentObject, self).save(*args, **kwargs)
>>> import datetime
>>> from media.models import *
>>> content_obj = ContentObject(title='testing')
>>> content_obj.pub_date = datetime.datetime(2010, 10, 9)
>>> content_obj.save()
content model save() called
title slug model save() called
date aware model save() called
>>> content_obj.modified_date
datetime.datetime(2010, 10, 9, 13, 31, 57, 782511)
>>> content_obj.slug
u'testing'
例2.从子类获取父类
定义继承关系
class Ticket(models.Model):
title = models.CharField(max_length=255, blank=True)
description = models.TextField(blank=True)
name = models.CharField(max_length=255, blank=True)
class InternalTicket(Ticket):
user = models.ForeignKey('auth.User', null=True)
class CustomerTicket(Ticket):
product = models.TextField(blank=True)
产生数据
In [1]: CustomerTicket.objects.create(product='Videos', title='Odd Playback', description='doesnt play back fast enough', name='Jane Smith')
Out[1]: <CustomerTicket: CustomerTicket object>
In [2]: Ticket.objects.all()
Out[2]: [<Ticket: Ticket object>]
In [3]: ticket = Ticket.objects.get()
In [4]: ticket.customerticket
Out[4]: <CustomerTicket: CustomerTicket object>
In [5]: ticket.customerticket.product
Out[5]: 'Videos'
In [6]: ticket.description
Out[6]: 'doesnt play back fast enough'
获取数据
n [1]: customer = CustomerTicket.objects.get()
In [2]: customer.description
Out[2]: 'doesnt play back fast enough'
In [3]: customer.ticket_ptr
Out[3]: <Ticket: Ticket object>
In [4]: customer.ticket_ptr_id
Out[4]: 1