Django运行出现Profile matching query does not exist错误如何解决?
问题根因
报错Profile matching query does not exist是因为当前登录的用户在Profile表中没有对应的关联记录,你调用Profile.objects.get(user=request.user)时找不到匹配项就抛出了该异常。
修复方案
1. 修正模型关联逻辑
User和Profile是典型的一对一关系,你当前用ForeignKey会允许一个用户对应多个Profile,不符合业务逻辑,先修改models.py中的Profile类:
class Profile(models.Model): # 把ForeignKey改成OneToOneField user = models.OneToOneField(User, on_delete=models.CASCADE)
修改后执行迁移命令生效:
python manage.py makemigrations python manage.py migrate
2. 新增用户自动创建Profile的逻辑
用Django信号实现用户注册成功后自动生成对应的Profile记录,避免后续再出现有用户无Profile的情况:
在你的应用目录下新建signals.py,添加如下代码:
from django.db.models.signals import post_save from django.dispatch import receiver from .models import User, Profile @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()
然后修改你应用的apps.py,在AppConfig的ready方法中导入信号触发注册:
from django.apps import AppConfig class 你的应用名Config(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = '你的应用名' def ready(self): import 你的应用名.signals
3. 补全历史用户的Profile记录
已经存在的用户没有对应的Profile,可以通过Django shell批量补全:
执行python manage.py shell进入交互环境,运行以下代码:
from 你的应用名.models import User, Profile for user in User.objects.all(): Profile.objects.get_or_create(user=user)
4. 代码层增加容错处理
可以直接修改views.py中查询Profile的代码,就算没有找到也会自动创建,避免报错:
# 把原来的form.authore = Profile.objects.get(user=request.user)替换为 profile, _ = Profile.objects.get_or_create(user=request.user) form.authore = profile
额外注意的隐藏问题
- 你代码中
authore是拼写错误,建议统一修正为author,避免后续维护踩坑 Post模型的likes字段定义为PositiveIntegerField,但serialize方法中调用了self.likes.count(),整数类型没有count方法,会触发新的报错:如果要记录点赞数直接返回self.likes即可,如果要记录点赞用户列表,需要把likes改为ManyToManyField(User, related_name="liked_posts")
内容的提问来源于stack exchange,提问作者wajd
相关产品推荐
相关产品推荐

