Python Django:向现有模型添加新外键,默认值为同一模型中的另一个外键

Python Django:向现有模型添加新外键,默认值为同一模型中的另一个外键,python,django,postgresql,foreign-keys,Python,Django,Postgresql,Foreign Keys,我最近开始使用Django,所以请耐心等待。我有一个有两个外键的模型 类应用程序(models.Model): assessment\u owner=models.ForeignKey(用户,相关的\u name='assessment\u owner') creator=models.ForeignKey(用户,相关的_name='creator') 我正在尝试将名为tech_lead的新外键添加到同一模型中,tech_lead的默认值应该是assessment_owner。稍后,我可以使用数

我最近开始使用Django,所以请耐心等待。我有一个有两个外键的模型

类应用程序(models.Model):
assessment\u owner=models.ForeignKey(用户,相关的\u name='assessment\u owner')
creator=models.ForeignKey(用户,相关的_name='creator')

我正在尝试将名为tech_lead的新外键添加到同一模型中,tech_lead的默认值应该是assessment_owner。稍后,我可以使用数据加载更新tech_lead的值,但最初它应该是评估所有者

在下面的代码片段中,Django在进行迁移时请求一个默认值,并在任何地方分配相同的技术线索。我想为tech_lead through代码定义默认值,但简单的默认属性不起作用。我尝试过使用信号前保存和后保存没有运气

class Application(models.Model):
    assessment_owner = models.ForeignKey(User, related_name='assessment_owner')
    creator = models.ForeignKey(User, related_name='creator')
    tech_lead = models.ForeignKey(User, related_name='tech_lead')
我正在使用Django 1.11.3和postgreSQL

使用一次性默认值成功迁移

错误堆栈-


提前感谢。

tech\u lead=models.ForeignKey(用户,相关的\u name='tech\u lead')

破坏完整性,因为数据库中已填充了
应用程序
实例。如果要将不可为null的FK添加到方案中,则应指定默认值。否则,如果不能提供默认值,则应考虑允许<代码> TekEdgult为null,即:


tech\u lead=models.ForeignKey(用户,相关的\u name='tech\u lead',null=True)

然后,使用以使用所需的值填充字段:

from django.db import migrations

def populate_tech_lead(apps, schema_editor):
    Application = apps.get_model('yourappname', 'Application')
    for application in Application.objects.all():
        application.tech_lead = application.assessment_owner
        application.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(populate_tech_lead),
    ]
然后从字段中删除
null=True


tech\u lead=models.ForeignKey(用户,相关的\u name='tech\u lead')
步骤1。将
null=True
添加到技术领先者字段中,如下所示:

class Application(models.Model):
    assessment_owner = models.ForeignKey(User, related_name='assessment_owner')
    creator = models.ForeignKey(User, related_name='creator')
    tech_lead = models.ForeignKey(User, related_name='tech_lead', null=True)

您能给我们看一下跟踪日志吗?与其分配三个不同的用户,为什么不将这些角色添加到用户模型中呢?如果这个应用程序是由其他人构建的,并且是这样设计的,那么为什么不让它成为多个呢。我只是在现有应用程序中添加新功能。同意,但我不想硬编码默认值,这样所有应用程序都将具有相同的技术领先优势。我想分配与评估所有者相同的默认值。您可以在3次迁移中完成。Create nullable field=>Create to update field value=>make field not nullable@Kyryl Havrylenko尝试了您的解决方案。1.添加null=True,2。运行makemigrations 3。更新迁移文件,将评估负责人分配给技术负责人。4.删除空=真5。运行makemigrations。并选择了选项2,即-暂时忽略,因为我已经添加了RunPython。6.迁移失败,出现相同错误-编程错误技术负责人id不存在。请引导。添加
null=True
,运行
makemigrations
;运行
makemigrations——清空appname
并在内部添加
RunPython
;删除
null=True
,运行
makemigrations
;运行
migrate
尝试了此解决方案,但我仍然看到ProgrammingError application.tech\u lead\u id在运行python时不存在。/manage.py migrate:(对我不起作用。Trows ProgrammingError tech_lead_id不存在。此解决方案现在可以工作,因为迁移历史记录正确,但此解决方案需要手动运行查询以更新值。我们手动部署应用程序,但它不在我的控制范围内,我必须指示部署团队在部署时遵循此额外步骤,这似乎不是个好主意。谢谢你的解决方案。我学到了一些新东西:)
from your_app.models import Application
from django.db.models.expressions import F

Application.objects.filter(tech_lead__isnull=True).update(tech_lead=F('assessment_owner'))