【发布时间】:2021-01-05 03:57:12
【问题描述】:
我希望 Django 中的 User 对象链接到 Client 对象(我创建的)。为此,我使用与 Profile 类(我创建的)的一对一链接来扩展 User 模型 链接用户和客户的类配置文件。我按照https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html 的说明进行操作,到目前为止一切顺利。
但是,当我创建用户对象时,默认情况下我无权访问我想要我的用户对象
我的models.py:
from django.contrib.auth.models import User
[...]
class Client(models.Model):
name = models.CharField(max_length=255)
address = models.CharField(max_length=255)
[...]
class Profile(models.Model):
need_setup = Client.objects.get(name='NEED TO ADD CLIENT IN ADMIN > PROFILES')
user = models.OneToOneField(User, on_delete=models.CASCADE)
client = models.ForeignKey(Client, on_delete=models.DO_NOTHING)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
当我进行迁移/运行服务器时出现问题(我的应用程序称为“仪表板”):
django.db.utils.ProgrammingError: relation "dashboard_client" does not exist LINE 1: ...nque_id", "dashboard_client"."date_creation" FROM "dashboard...
因为need_setup = Client.objects.get(name='NEED TO ADD CLIENT IN ADMIN > PROFILES')(如果我把它注释掉就没有问题了)。
我可以通过在数据库中手动创建一个名为“NEED TO ADD CLIENT IN ADMIN > PROFILES”的客户端来解决此问题,然后运行我的迁移和部署,但我正在寻找一种更好的方法,尤其是当我在 prod 中从头开始部署。
我试图覆盖apps.py 中的def ready(self) 函数,该函数在应用程序启动时运行。不幸的是,它在运行之前需要有正确的 models.py。
感谢您的想法和想法!
【问题讨论】:
-
所以,你的问题是你试图在你的
Profile模型中getClient的一个实例。一开始,您实际上没有任何客户端实例,因此您对Client.objects.get()的调用理所当然地返回了错误。这就是当您手动将客户端添加到与该名称匹配的数据库时解决此问题的原因。我不确定您对need_setup字段的目标是什么,但就目前而言,它实际上不是一个字段,它是一个查询集,不应该在模型中。如果你能弄清楚need_setup应该是什么,我们可能会弄清楚如何解决它 -
我同意@rchurch4。似乎您想知道哪些配置文件对象是使用来自保存后信号
create_user_profile的user新创建的。在这种情况下,您可以简单地将need_setup设置为默认值为True的BooleanField。然后,重写save方法来检查对象是否有一个client链接。如果client仍然为空,则保持need_setup为True,否则设置为False。 -
是的,正是我想要的 ^
-
你们俩都是传奇,非常感谢。我确实从@Scratch'N'Purr 实现了这个想法 - 你可以将它作为答案发布,以便我可以将其标记为已回答吗?伙计们干杯
标签: python django django-models