Внешний ключ в Django Models, похоже, не генерируется автоматически

models.py

class Job(models.Model):

    jobname = models.CharField(max_length = 1000)
    owner = models.CharField(max_length = 150)
    enabled = models.BooleanField(default = True)
    freq_type = models.IntegerField(default = 1)
    freq_interval = models.IntegerField(default = 0)
    freq_recurrence = models.IntegerField(default = 0)
    start_date=models.CharField(max_length=10)
    end_date=models.CharField(max_length=10, blank = True)
    start_time=models.CharField(max_length=6)
    end_time=models.CharField(max_length=6, blank = True)
    date_added = models.DateTimeField(default=timezone.now)
    date_modified=models.DateTimeField(null = True)
    version=models.IntegerField(default = 1)

class Job_detail(models.Model):
    job_type=models.IntegerField()
    json = models.CharField(max_length = 1000)
    jobid = models.ForeignKey(Job, on_delete=models.CASCADE)

class Job_track(models.Model):
    status = models.IntegerField(default = 3)
    output = models.CharField(max_length=500, blank = True)
    location = models.CharField(max_length = 500, blank = True)
    jobid = models.ForeignKey(Job, on_delete=models.CASCADE)
    jobdetailid = models.ForeignKey(Job_detail, on_delete=models.CASCADE)

forms.py

class JobForm(ModelForm):
    class Meta:
        model = Job
        fields = []

class JobDetailForm(ModelForm):
    class Meta:
        model = Job_detail
        fields = []
        exclude = ['jobid']

class JobTrackForm(ModelForm):
    class Meta:
        model= Job_track
        fields = []
        exclude = ['jobid', 'jobdetailid']

В функции моих взглядов:

Когда я пытаюсь нажать кнопку отправки в браузере, я получаю следующую ошибку

NOT NULL constraint failed: interface_job_detail.jobid_id

Не должен ли внешний ключ генерироваться сам по себе, если я объявлю, с какой таблицей он связан? Я связал jobid таблицы Job_detail с таблицей Job. Но, похоже, это не работает. Может ли кто-нибудь объяснить, как я делаю это неправильно, и показать мне способ исправить это? Спасибо!

Обновление:

Я удалил exclude из своих форм, но все равно получаю ту же ошибку

Поскольку вы используете commit=False, это не сохраняет экземпляр в db.

Этот метод save() принимает необязательный аргумент ключевое слово commit, которое принимает значение True или False. Если вы вызовете метод save() с commit=False, то он вернет объект, который еще не был сохранен в базу данных. В этом случае вы сами должны вызвать save() для результирующего экземпляра модели. Это полезно, если вы хотите выполнить пользовательскую обработку объект перед его сохранением, или если вы хотите использовать одну из commit по умолчанию равен True.

Другой побочный эффект использования commit=False проявляется, когда ваша модель имеет связь "многие-ко-многим" с другой моделью. Если ваша модель имеет многие-ко-многим и вы указываете commit=False, когда вы сохраняете форму, Django не может немедленно сохранить данные формы для отношения "многие-ко-многим". Это происходит потому, что невозможно сохранить данные отношения "многие-ко-многим" для экземпляра, пока этот экземпляр не существует в базе данных.

Чтобы обойти эту проблему, каждый раз, когда вы сохраняете форму с использованием commit=False, Django добавляет метод save_m2m() в ваш ModelForm подкласса ModelForm. После того, как вы вручную сохранили экземпляр, созданный формы, вы можете вызвать метод save_m2m() для сохранения данных формы "многие ко многим".

.

вы можете увидеть это из документации :

https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/#the-save-method

Вы создаете и сохраняете экземпляр Job (с именем j), но нет никакого способа, чтобы экземпляр Job_detail (jobd) автоматически связался с этим экземпляром. Вы должны специально заполнить внешний ключ перед сохранением экземпляра, т.е.

jobd.jobid = j
jobd.save()

аналогично для Job_track экземпляра (jobt):

jobt.jobid = j
jobt.jobdetailid = jobd
jobt.save()

В качестве примечания посмотрите PEP-8 и попробуйте назвать свои классы (например, JobDetail вместо Job_detail) и переменные (job_d или лучше job_detail вместо jobd) в соответствии с ним. Ваша текущая схема именования сбивает с толку.

Вернуться на верх