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错。