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

Nel*_*ing 6 django django-models

我正在尝试扩展内置用户并向其添加更多信息。我的 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()
Run Code Online (Sandbox Code Playgroud)

我之前已经成功地做到了这一点,但今天由于某种原因,当我尝试通过 django 管理员登录时,我不断收到RelatedObjectDoesNotExist at /admin/login/, no such column: user_details_profile.id. 不涉及其他组件,没有视图或任何其他组件。它只是模型和管理面板。我试图让模型显示在管理面板中,但每次尝试登录时都会遇到此错误。这是回溯http://dpaste.com/0W7653C。任何人都可以告诉我我做错了什么以及如何让它工作。帮助。

Wil*_*sem 10

如果定义了OneToOneField,它意味着目标模型的每个对象包含从参考模型中的对象。AOneToOneField本质上是ForeignKey一个unique=True(以及一些额外的逻辑来进行正确的命名)。

因此,这意味着虽然每个人Profile都有一个相关的用户,但并不是每个用户都有一个Profile. 可能存在存在的Users Profile存在的。

如果您因此查询some_user.profile有两种情况可以展开:

  1. 有一个相关的 Profile对象被获取并返回;或者
  2. 没有这样的对象,然后它会引发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)
Run Code Online (Sandbox Code Playgroud)

因此,我们检查 是否instance有一个.profile指向一个Profile对象。如果没有,它将引发异常,然后我们创建一个异常。

这也是多在ë asier到SK ˚F orgiveness比P的Django的ermission(EAFP)精神。