Django-在删除文章所关联的分类的时候,属于该分类的文章都被删除了。

本文详细介绍了 Django 框架中模型之间的关系定义方式,特别是 ForeignKey 字段的使用方法及其 on_delete 参数的不同选项所带来的影响。通过一个具体的示例说明了如何避免因删除关联分类而引发的数据丢失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.关系代码


分类的模型:

class Category(models.Model):
    """
    博主个人文章分类表
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分类标题', max_length=32,unique=True)

    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
文章的模型:

class Article(models.Model):
    '''
    文章详细
    '''
    nid = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name='文章标题',max_length=128)
    summary = models.CharField(verbose_name='文章简介',max_length=255)
    read_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)
    create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    blog = models.ForeignKey(verbose_name='所属博客',to='Blog',to_field='nid')



    category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True,on_delete=models.SET_NULL)

2.执行代码

@auth
def delete_category(request):
    if request.method == 'POST':
        data = request.POST.get('nid')
        blog_id = request.session['user_info']['blog__nid']
        models.Category.objects.filter(nid=data).delete()
        return HttpResponse(200)
通过分类的nid删除对象,被关联的文章间接被django默认级联删除了。


3.解决办法:

将文章的模型中,关联分类的category属性设为:

category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True,on_delete=models.SET_NULL)


4.相关资料

给ForeignKey增加属性,

on_delete=models.SET_NULL

即可。

该属性还有其他值可选:


CASCADE: 默认的,级联删除


PROTECT: 通过抛出django.db.models.ProtectedErrordjango.db.models.ProtectedError错误来阻止删除关联的对象


SET_NULL: 设置ForeignKey 为 null; 这个只有设置了null 为 True的情况才能用

SET_DEFAULT: 设置 ForeignKey 为默认值; 默认值必须预先设置

SET(): 设置为某个方法返回的值


DO_NOTHING: 什么都不做,如果数据库设置必须关联则会报IntegrityError错。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值