我最近开始使用Django,所以请耐心点。我有一个带两个外键的模型
class Application(models.Model): assessment_owner = models.ForeignKey(User, related_name='assessment_owner') creator = models.ForeignKey(User, related_name='creator')
我正在尝试将名为tech_lead的新外键添加到同一模型中,tech_lead的默认值应为assessment_owner。稍后,我可以使用数据加载更新tech_lead的值,但最初它应该是assessment owner。
使用下面的代码片段,Django在进行迁移时要求一个默认值,并在任何地方分配相同的tech_lead。我想为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。
迁移成功,具有一次性默认值。
错误堆栈-
Env details
error
error
提前谢谢。

最佳答案

tech_lead = models.ForeignKey(User, related_name='tech_lead')
由于数据库中已填充了Application实例,因此会破坏完整性。如果要向方案中添加不可为空的FK,则应指定默认值。否则,如果不能提供默认值,则应考虑允许tech_lead为空,即:
tech_lead = models.ForeignKey(User, related_name='tech_lead', null=True)
然后使用data migration用所需的值填充字段:

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_lead = models.ForeignKey(User, related_name='tech_lead')

关于python - Django:将新外键添加到现有模型中,并将默认值作为同一模型中的另一个外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55238540/

10-11 14:19
查看更多