django ContentType使用实例

最近在学习补卡、报销等需要审批的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)

Django 中,可以使用 ContentType 模型来创建一个通用的关系表,这个表可以建立任意两个模型之间的关系。这个模型包含以下字段: - app_label:表示模型所在应用的名称。 - model:表示模型的名称。 - content_type:表示一个 ContentType 实例,它可以引用到一个具体的模型。 - object_id:表示一个具体模型实例的 ID。 通过以上字段,我们可以将一个模型实例与任意其他模型实例建立关系,而且这个关系表是通用的,可以被多个模型使用。 下面是一个使用 ContentType 模型建立关系表的示例: ```python from django.contrib.contenttypes.models import ContentType from django.db import models class Like(models.Model): content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') user = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f'{self.user.username} likes {self.content_object}' ``` 在这个例子中,Like 模型表示一个用户对某个模型实例的喜欢,其中 content_type 和 object_id 字段用于关联到具体的模型实例,content_object 字段是一个 GenericForeignKey,用于引用到具体的模型实例。当我们创建一个 Like 实例时,只需要指定 content_type、object_id 和 user 字段就可以了,而 content_object 字段可以通过这两个字段自动关联到具体的模型实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值