我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?相关的知识,希望对你有一定的参考价值。
我正在尝试扩展内置用户并向其添加更多信息。我的django项目中有两个应用程序 - general和user_details。在我的user_details应用程序中,在models.py文件中,我有以下内容......
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from general.models import Ward
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
firstname = models.CharField(max_length=20)
middlename = models.CharField(max_length=20)
lastname = models.CharField(max_length=20)
loc_id = models.CharField(max_length=8, unique=True)
ward = models.ForeignKey(Ward, related_name="wards", on_delete=models.CASCADE)
phone = models.CharField(max_length=10, unique=True)
address = models.CharField(max_length=255)
postal_code = models.CharField(max_length=15)
def __str__(self):
return "{} {}".format(self.user.first_name, self.user.last_name)
class Meta:
verbose_name_plural = "User details"
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
else:
instance.profile.save()
我之前已成功完成此操作,但今天出于某种原因,当我尝试通过django管理员登录时,我不断获得RelatedObjectDoesNotExist at /admin/login/, no such column: user_details_profile.id
。没有涉及其他组件,没有视图或任何视图。它只是模型和管理面板。我试图让模型显示在管理面板中,但每次我尝试登录时都会遇到此错误。这是追溯http://dpaste.com/0W7653C。谁能告诉我我做错了什么以及如何让它工作。救命。
如果定义OneToOneField
并不意味着目标模型的每个对象都包含来自引用模型的对象。 OneToOneField
本质上是一个ForeignKey
与unique=True
(以及一些额外的逻辑来做正确的命名)。
因此,这意味着尽管每个Profile
都有相关用户,但并非每个用户都有Profile
。有可能存在没有User
的Profile
s。
如果你这个查询qazxsw poi有两个场景可以展开:
- 有一个相关的
some_user.profile
对象是获取的,并返回;要么 - 没有这样的对象,然后它引发了
Profile
错误。
在后一种情况下,有一些建议要求返回RelatedObjectDoesNotExist
,但由于向后兼容性,这可能不会在(近)未来实施,或者根本不实施。
所以你可能有一个没有配置文件的用户。基于完整的回溯,错误发生在行None
上。如果没有这样的配置文件,我们可以通过创建配置文件来解决此问题:
instance.profile.save()
因此,我们检查from django.core.exceptions import ObjectDoesNotExist
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
try:
instance.profile.save()
except ObjectDoesNotExist:
Profile.objects.create(user=instance)
是否有导致instance
物体的.profile
。如果它没有,它将引发异常,然后我们创建一个异常。
这也是更容易请求宽恕而不是权限(EAFP)的Django精神。
以上是关于我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?的主要内容,如果未能解决你的问题,请参考以下文章
即使在进行迁移之后,/admin/login/ 处的 OperationalError
/admin/login/ 的 OperationalError 没有这样的表:auth_user
django 管理员加载错误:/admin/login/ 处的 ImportError 没有名为后端的模块
Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)