You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中select_related在关联用户删除时返回空查询集问题

问题原因及解决办法

核心原因

Django中外键默认的on_delete=models.CASCADE,当关联的用户被删除时,所有关联的MyModel实例会被自动级联删除,所以你查询MyModel.objects.all()(包括带select_related的)会返回空集。

如果你的需求是删除用户后保留MyModel实例,只将关联字段置空,按以下步骤修改:

解决步骤

  1. 修改MyModel的外键定义,添加null=True、blank=True并设置on_delete=models.SET_NULL:
class MyModel(models.Model):
    created_user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
  1. 执行数据库迁移,让修改生效:
python manage.py makemigrations
python manage.py migrate

额外说明

如果你的MyModel实例并未被级联删除(比如手动修改过数据库或之前自定义了on_delete行为),但使用select_related返回空集,是因为默认select_related使用内连接,会过滤掉没有关联用户的MyModel实例。此时只要确保外键设置了null=True,select_related会自动转为左外连接,就能返回所有MyModel实例(包括created_user为null的)。

内容的提问来源于stack exchange,提问作者Anoop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:35:26