我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?

问题描述 投票:1回答:1

我正在尝试扩展内置用户并向其添加更多信息。我的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。谁能告诉我我做错了什么以及如何让它工作。救命。

django django-models
1个回答
1
投票

如果定义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精神。

© www.soinside.com 2019 - 2024. All rights reserved.