django contenttype完成大量外键的操作

在某些场景下我们需要对一张表设置很多的同类型外键,例如现在有几张表,article,news,question三张表,我们根据产品需要,需要再为这三张表设置一个comment(评论表),普通的的策略是在comment中设置三个外键指向之前的三张表,这就引发了一些问题,

class Article(models.Model):
	body = models.CharField(max_length=255)
	
class News(models.Model):
	body = models.CharField(max_length=255)

class Question(models.Model):
	body = models.CharField(max_length=255)

class Commet(models.Model):
	article = models.ForeignKey(Article)
	news = models.ForeignKey(News)
	question = models.ForeignKey(Question)
	.....

会面临的重复造轮子,而且我们在具体的业务中叶需要再写逻辑去取外键所指的表
,具体操作起来会很麻烦

而django在我们初始创建项目时就为我们安装好了一个contenttype框架,此框架提供了很多的类,而且在数据库中自动生成的表 记载着我们每个app下都有哪些的model。这样我们可以利用的框架提供给我们的方便来进行操作。

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey

class Comments(models.Model):
    pinglun = models.CharField(max_length=255)
    
    #此字段在数据表不存在,用于协助下面两个字段进行各类操作
    content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.CASCADE)
    # 定位对象的id
    object_id = models.PositiveIntegerField(blank=True, null=True)
    # 外键所指对象的model 在django_content_type表中的id
    content_object = GenericForeignKey('content_type', 'object_id')

class Article(models.Model):
    body = models.CharField(max_length=255)
    #不会生成此字段,此字段用于协助操作
    comment = GenericRelation(Comments)

class News(models.Model):
    body = models.CharField(max_length=255)
    comment = GenericRelation(Comments)

这样我们就免去了重复造轮子的工作,而且在增删改查的逻辑方面也会节省很多代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值