我希望将Django中的User对象链接到我创建的Client对象。为此,我使用与用户和客户端链接的Profile类(由我创建)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')
(如果我注释掉就没有问题)。
我可以通过在数据库中手动创建一个名为“需要在ADMIN中添加客户端>配置文件”的客户端来解决该问题,然后运行迁移和部署,但是我正在寻找一种更好的方法,尤其是当我从在产品中刮擦。
我试图覆盖def ready(self)
apps.py中的功能,此功能在应用程序启动时运行。不幸的是,在运行之前,它需要具有正确的models.py。
您的想法和想法受到赞赏!
根据我对您案件的了解,您希望:
client
(您要解决的问题)在这种情况下,您可以将need_setup
字段设置为属性为的BooleanField default=True
。这意味着默认情况下需要设置所有新创建的Profile对象。为了安全起见,您可以添加属性,editable=False
以使该字段不能在外部进行修改。
class Profile(models.Model):
need_setup = models.BooleanField(default=True, editable=False)
user = models.OneToOneField(User, on_delete=models.CASCADE)
client = models.ForeignKey(Client, on_delete=models.DO_NOTHING)
接下来,您将覆盖模型的save
方法,以根据是否client
填充来切换布尔字段。
class Profile(models.Model):
need_setup = models.BooleanField(default=True, editable=False)
user = models.OneToOneField(User, on_delete=models.CASCADE)
client = models.ForeignKey(Client, on_delete=models.DO_NOTHING)
def save(self, *args, **kwargs):
if self.client is None:
self.need_setup = True
else:
self.need_setup = False
super().save(*args, **kwargs)
另一种解决方案是使用python的@property
。使用此解决方案,您基本上将need_setup
属性设置为属性,而不是字段。这样做的好处是不必在数据库级别创建字段。该解决方案的缺点是您不能在django查询集中使用它,例如Profile.objects.filter(need_setup=True)
,因为django查询集使用数据库字段。
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
client = models.ForeignKey(Client, on_delete=models.DO_NOTHING)
@property
def need_setup(self):
return not bool(self.client)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句