我一直在/ 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本质上是一个ForeignKeyunique=True(以及一些额外的逻辑来做正确的命名)。

因此,这意味着尽管每个Profile都有相关用户,但并非每个用户都有Profile。有可能存在没有UserProfiles。

如果你这个查询qazxsw poi有两个场景可以展开:

  1. 有一个相关的some_user.profile对象是获取的,并返回;要么
  2. 没有这样的对象,然后它引发了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中成功创建用户配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

django篇-路由系统介绍

记一次因为路由出的差错

即使在进行迁移之后,/admin/login/ 处的 OperationalError

/admin/login/ 的 OperationalError 没有这样的表:auth_user

django 管理员加载错误:/admin/login/ 处的 ImportError 没有名为后端的模块

Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)