Python django.db.utils.ProgrammingError:关系“&引用;不存在

Python django.db.utils.ProgrammingError:关系“&引用;不存在,python,django,django-models,Python,Django,Django Models,我希望Django中的用户对象链接到客户机对象(我创建的)。为此,我用一个Profile类(我创建的)一对一链接扩展了用户模型 链接用户和客户端的类配置文件。到目前为止,我很好地遵守了指示 但是,当我创建一个用户对象时,默认情况下我无权访问我想要的用户对象 My models.py: 来自django.contrib.auth.models导入用户 [...] 类客户端(models.Model): name=models.CharField(最大长度=255) 地址=models.CharFi

我希望Django中的用户对象链接到客户机对象(我创建的)。为此,我用一个Profile类(我创建的)一对一链接扩展了用户模型 链接用户和客户端的类配置文件。到目前为止,我很好地遵守了指示

但是,当我创建一个用户对象时,默认情况下我无权访问我想要的用户对象

My models.py:

来自django.contrib.auth.models导入用户
[...]
类客户端(models.Model):
name=models.CharField(最大长度=255)
地址=models.CharField(最大长度=255)
[...]
类配置文件(models.Model):
need_setup=Client.objects.get(name='need TO ADD Client IN ADMIN>PROFILES')
user=models.OneToOneField(用户,on_delete=models.CASCADE)
client=models.ForeignKey(client,on\u delete=models.DO\u NOTHING)
@接收方(保存后,发送方=用户)
def create_user_配置文件(发送方、实例、已创建、**kwargs):
如果创建:
Profile.objects.create(用户=实例)
@接收方(保存后,发送方=用户)
def save_user_配置文件(发送方、实例,**kwargs):
instance.profile.save()
当我进行迁移/runserver(我的应用程序称为“dashboard”)时会出现问题:
django.db.utils.ProgrammingError:关系“dashboard\u client”不存在第1行:…nque\u id,“dashboard\u client”。“date\u creation”来自“dashboard…”
由于
need\u setup=Client.objects.get(name='need TO ADD Client IN ADMIN>PROFILES')
(如果我把它注释掉,就没有问题了)

我可以通过在db中手动创建一个名为“需要在管理>概要文件中添加客户端”的客户端来解决这个问题,然后运行迁移和部署,但我正在寻找一种更好的方法,特别是当我在prod中从头开始部署时

我试图覆盖apps.py中的
def ready(self)
函数,该函数在应用启动时运行。不幸的是,在运行之前,它需要有正确的models.py


感谢您的想法和想法

根据我对您案例的理解,您希望:

  • 在创建用户后触发配置文件对象的创建,并将配置文件对象链接到用户(已使用post save信号完成)
  • 确定配置文件对象是否需要配置
    客户端
    (您要解决的问题)
  • 在这种情况下,将
    need\u setup
    字段设置为布尔字段,属性为
    default=True
    。这意味着默认情况下需要设置新创建的任何纵断面对象。对于安全措施,您可以添加属性
    editable=False
    ,以便该字段不能在外部修改

    类配置文件(models.Model):
    需要设置=models.BooleanField(默认为True,可编辑为False)
    user=models.OneToOneField(用户,on_delete=models.CASCADE)
    client=models.ForeignKey(client,on\u delete=models.DO\u NOTHING)
    
    接下来,覆盖模型的
    save
    方法,根据是否填充
    client
    来切换布尔字段

    类配置文件(models.Model):
    需要设置=models.BooleanField(默认为True,可编辑为False)
    user=models.OneToOneField(用户,on_delete=models.CASCADE)
    client=models.ForeignKey(client,on\u delete=models.DO\u NOTHING)
    def保存(自身、*args、**kwargs):
    如果self.client为无:
    self.need\u setup=True
    其他:
    self.need\u setup=False
    super().save(*args,**kwargs)
    
    另一种解决方案是使用python的
    @属性
    。使用此解决方案,基本上将
    need\u setup
    设置为属性,而不是字段。这样做的优点是不必在数据库级别创建字段。此解决方案的缺点是不能在django查询集(例如,
    Profile.objects.filter(need_setup=True)
    )中使用它,因为django查询集使用数据库字段

    类配置文件(models.Model):
    user=models.OneToOneField(用户,on_delete=models.CASCADE)
    client=models.ForeignKey(client,on\u delete=models.DO\u NOTHING)
    @财产
    def需要_设置(自身):
    返回非bool(self.client)
    
    所以,这里的问题是,您试图
    在您的
    配置文件
    模型中获取
    客户机
    的实例。一开始,您实际上没有任何客户端实例,因此对
    client.objects.get()
    的调用正确地返回了一个错误。这就是为什么在手动将与该名称匹配的客户机添加到数据库时,此问题会得到修复。我不确定您对
    need\u setup
    字段的目标是什么,但现在它实际上不是一个字段,而是一个查询集,不应该在模型中。如果你能弄清楚
    need\u setup
    应该是什么,我们可能会想出如何修复itI,我同意@rchurch4。似乎您想从post save信号
    create\u user\u Profile
    中了解哪些配置文件对象是用
    user
    新创建的。在这种情况下,您只需将
    need\u setup
    设置为默认值为
    True
    的布尔字段。然后,重写
    save
    方法以检查对象是否链接了
    客户端。如果
    client
    仍然为空,请将
    need\u setup
    设置为True,否则设置为False。是的,正是我想要的^。我确实是从@Scratch'N'Purr开始实施这个想法的——你能把它作为一个答案发布,这样我就可以把它标记为已回答吗?干杯,伙计们