Django中select_related在关联用户删除时返回空查询集问题
问题原因及解决办法
核心原因
Django中外键默认的on_delete=models.CASCADE,当关联的用户被删除时,所有关联的MyModel实例会被自动级联删除,所以你查询MyModel.objects.all()(包括带select_related的)会返回空集。
如果你的需求是删除用户后保留MyModel实例,只将关联字段置空,按以下步骤修改:
解决步骤
- 修改
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 )
- 执行数据库迁移,让修改生效:
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
相关产品推荐
相关产品推荐

