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手动补全:
- 进入项目根目录,运行
python manage.py shell - 执行以下代码:
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
相关产品推荐
相关产品推荐

