Django中用户作为外键被删除时,如何保留关联模型内的用户邮箱?
Django 外键关联用户删除后保留邮箱的实现方案
注意:ForeignKey 字段本身存储的是关联用户表的主键ID,无法直接存储邮箱值,直接在on_delete=models.SET()中传入邮箱会触发字段类型不匹配报错,必须新增冗余字段存储邮箱信息才能实现需求
最终代码实现
from django.db import models from django.conf import settings class Text(models.Model): title = models.CharField(max_length=45) text = models.TextField() user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True ) # 新增冗余字段固定存储用户邮箱,用户删除后值仍保留 user_email = models.EmailField(verbose_name="发布用户邮箱", null=True, blank=True) def save(self, *args, **kwargs): # 保存时自动同步当前关联用户的邮箱到冗余字段 if self.user: self.user_email = self.user.email super().save(*args, **kwargs)
补充可选优化
如果需要在用户修改自身邮箱时,自动同步更新所有关联Text记录的邮箱值,可添加Django信号监听逻辑:
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=settings.AUTH_USER_MODEL) def sync_user_email_to_text(sender, instance, created, **kwargs): # 仅处理用户信息更新的场景,跳过新用户创建场景 if not created: Text.objects.filter(user=instance).update(user_email=instance.email)
如果你的业务不需要保留和已删除用户的关联关系,也可以直接删除user外键字段,仅保留user_email字段,在创建Text记录时直接写入当前登录用户的邮箱即可,实现更轻量化。
内容的提问来源于stack exchange,提问作者Montio5
相关产品推荐
相关产品推荐

