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有两种情况可以展开:
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)Run Code Online (Sandbox Code Playgroud)
因此,我们检查 是否instance有一个.profile指向一个Profile对象。如果没有,它将引发异常,然后我们创建一个异常。
这也是多在ë asier到甲SK ˚F orgiveness比P的Django的ermission(EAFP)精神。
| 归档时间: |
|
| 查看次数: |
4020 次 |
| 最近记录: |