最近在学习补卡、报销等需要审批的oa工作流。也是经过几番周转,才看到ContentType能完成通用外键。因为网上资料太多,自己记录一遍,以后回顾复习很方便、有印象。
参考了这篇文章,写得很好,参考连接,配合下列实例,有更直观的感受
# models.py
from django.contrib.auth.models import User
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models
class Audit(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
audit_datetime = models.DateTimeField(verbose_name='审核时间')
user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
#补卡模型
class Supplement(models.Model):
am_or_pm = models.CharField(verbose_name='补卡班次', max_length=10)
audit = GenericRelation(to='Audit')
#日报模型
class Daily(models.Model):
detail = models.TextField(verbose_name='说明')
audit = GenericRelation(to='Audit')
# admin.py
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from .models import *
class AuditInlineAdmin(GenericTabularInline):
model = Audit
extra = 0
class DailyAdmiin(admin.ModelAdmin):
inline = [AuditInlineAdmin]
class SupplementAdmin(admin.ModelAdmin):
inline = [AuditInlineAdmin]
admin.site.register(Daily, DailyAdmin)
admin.site.register(Supplement,SupplementAdmiin)