Django: добавить новый внешний ключ к существующей модели со значением по умолчанию в качестве другого внешнего ключа от той же модели - PullRequest
1 голос
/ 19 марта 2019

Я недавно начал использовать Django, поэтому, пожалуйста, будьте терпеливы.У меня есть модель с 2 внешними ключами

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

Я пытаюсь добавить новый внешний ключ с именем tech_lead к той же модели, и значением по умолчанию для tech_lead должно бытьvaluation_owner.Позже я могу обновить значение для tech_lead, используя загрузку данных, но изначально оно должно быть владельцем оценки.

Используя следующий фрагмент кода, Django запрашивает значение по умолчанию при выполнении миграций и назначает один и тот же tech_lead везде.Я хотел бы определить значение по умолчанию для tech_lead через код, и простой атрибут по умолчанию не работает.Я безуспешно пытался использовать сигналы pre_save и post_save.

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

ошибка

ошибка

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Шаг 1. Добавьте null=True в поле tech_lead как

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', <b>null=True</b>)

Шаг 2. Создайте файл миграции по python manage.py makemigrations

Шаг 3. Миграция БД python manage.py migrate

Шаг 4. Откройте оболочку Django, python manage.py shell

Шаг 5. запустите следующий скрипт

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'))
1 голос
/ 19 марта 2019

tech_lead = models.ForeignKey(User, related_name='tech_lead')

нарушает целостность, потому что ваша база данных уже заполнена Application экземплярами. Если вы хотите добавить ненулевой FK в вашу схему, вам следует указать значение по умолчанию. В противном случае, если вы не можете предоставить значение по умолчанию, вам следует рассмотреть возможность предоставления tech_lead значения NULL, т.е.:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...