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

Django中SiteUser匹配查询不存在错误排查求助

问题原因

你当前的代码错误在于:用User的ID直接查询SiteUser的主键ID,但SiteUser与User是一对一关联(通过page_user字段),两者的主键ID并不一定相同。当某个User没有对应的SiteUser记录,或者SiteUser的ID和User的ID不匹配时,就会触发DoesNotExist异常。

解决方案

方案1:通过关联的User对象获取SiteUser(推荐)

修改views.py中的代码,利用Django一对一关联的反向查询,或者直接通过page_user字段匹配查询,同时用get_object_or_404替代get(),避免抛出未处理的异常:

from django.shortcuts import get_object_or_404
from django.contrib.auth.models import User
from .models import SiteUser, Interest

def userProfile(request, pk):
    # 先获取User对象,不存在则返回404
    user = get_object_or_404(User, id=pk)
    # 通过page_user关联字段获取对应的SiteUser,不存在则返回404
    userprof = get_object_or_404(SiteUser, page_user=user)
    
    posts = user.post_set.all()
    post_comments = user.comment_set.all()
    interests = Interest.objects.all()
    
    context = {
        'user': user,
        'userprof': userprof,
        'posts': posts,
        'post_comments': post_comments,
        'interests': interests
    }
    return render(request, 'library/profile.html', context)

如果你的业务逻辑确保每个User都有对应的SiteUser,也可以直接使用反向关联属性:

userprof = user.siteuser

但这种方式在没有对应SiteUser时仍会抛出异常,所以更推荐用get_object_or_404。

方案2:自动为新创建的User生成SiteUser

为了避免后续再出现无对应SiteUser的情况,可以在models.py中添加信号量,当User创建时自动生成对应的SiteUser:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

class SiteUser(models.Model):
    page_user = models.OneToOneField(User, on_delete=models.CASCADE)
    about = HTMLField()
    profile_pic = models.ImageField('profile_pic', upload_to='covers', null=True)

# 信号:创建User时自动创建SiteUser
@receiver(post_save, sender=User)
def create_siteuser(sender, instance, created, **kwargs):
    if created:
        SiteUser.objects.create(page_user=instance)

# 信号:保存User时同步保存SiteUser
@receiver(post_save, sender=User)
def save_siteuser(sender, instance, **kwargs):
    instance.siteuser.save()

方案3:补全已有User的SiteUser记录

对于已经存在的、没有对应SiteUser的User,可以通过Django Shell手动补全:

  1. 进入项目根目录,运行python manage.py shell
  2. 执行以下代码:
from django.contrib.auth.models import User
from library.models import SiteUser

# 为所有无对应SiteUser的User创建记录
for user in User.objects.all():
    SiteUser.objects.get_or_create(page_user=user)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:40:21