django.db.utils.ProgrammingError:关系“ ...”不存在

坦西布尔

我希望将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。

您的想法和想法受到赞赏!

Scratch'N'Purr

根据我对您案件的了解,您希望:

  1. 创建用户并触发Profile对象链接到用户后触发Profile对象的创建(已使用保存后的信号完成)。
  2. 确定是否需要使用配置文件配置文件对象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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django Rest框架“ django.db.utils.ProgrammingError:关系“患者”不存在”

“ django.db.utils.ProgrammingError:关系“ auth_user”不存在” Django V2.0

django.db.utils.ProgrammingError:无法加载:关系“”的列“”不存在

django.db.utils.ProgrammingError:关系“ bot_trade”不存在

django.db.utils.ProgrammingError: 运行 makemigrations 时关系“company_company”不存在

django.db.utils.ProgrammingError:递归模型不存在关系

django.db.utils.ProgrammingError:类型“ raster”不存在

django.db.utils.ProgrammingError:表不存在

Django测试失败,出现“ django.db.utils.ProgrammingError:关系“ django_content_type”不存在”

还有一个“django.db.utils.ProgrammingError:关系“device_gclouddevice”不存在”

django.db.utils.ProgrammingError:OenBSD vps已经存在关系

django.db.utils.ProgrammingError:列am.amcanorder不存在

django.db.utils.ProgrammingError:类型“ int4range”不存在

django.db.utils.ProgrammingError:(1146,“表'med_portal.Custparent'不存在”)

找不到 django/mysql 表 - django.db.utils.ProgrammingError: (1146, "表 'trustline.authentication_user' 不存在")

django.db.utils.ProgrammingError:使用heroku和djongo不存在column Calculator_calculation._id

django.db.utils.ProgrammingError:关系“choices_keyword”的列“image”已经存在

django.db.utils.ProgrammingError:关系“ django_site_domain_v2339b81_uniq”已存在

ProgrammingError:关系“ django_session”不存在

Python Django-内部错误ProgrammingError关系不存在

ProgrammingError:关系“ django_site”不存在

django.db.utils.OperationalError:严重:角色“ django”不存在

syncdb django.db.utils.ProgrammingError时出错:关系django_migrations的权限被拒绝

解决“ django.db.utils.ProgrammingError:关系django_migrations的权限被拒绝”的步骤

django.db.utils.OperationalError:致命:数据库不存在(postgres /部署到digitalocean)

Docker-psql:django.db.utils.OperationalError:致命:角色“ admin”不存在

django.db.utils.OperationalError:严重:数据库“路径”不存在

Django:关系不存在

将Django连接到Postgres:django.db.utils.OperationalError:严重:数据库“ DATABASENAME”不存在