Ошибка при создании таблицы закрытия в Django: объект 'ForeignKey' не имеет атрибута 'column'
У меня есть модель Jobs и мне нужна таблица закрытия job_hierarchies схема выглядит следующим образом
Table job_hierarchies {
account_id int [not null]
ancestor int [not null, ref: > jobs.id]
descendant int [not null, ref: > jobs.id]
level int [not null]
}
Я попробовал создать модель и миграцию для JobHierarchy следующим образом
Модель
# api/models/job_hierarchy.py
from django.db import models
from .base import BaseModel
from api.models import Job
class JobHierarchy(BaseModel):
account_id = models.IntegerField(null=False)
ancestor = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='ancestor_jobs', db_column='ancestor_id')
descendant = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='descendant_jobs', db_column='descendant_id')
level = models.IntegerField(null=False)
class Meta:
db_table = 'job_hierarchies'
Миграция выглядит следующим образом
# Generated by Django 5.0.2 on 2024-03-08 04:28
from django.db import migrations, models
def add_foreign_keys(apps, schema_editor):
JobHierarchy = apps.get_model('api', 'JobHierarchy')
Job = apps.get_model('api', 'Job')
schema_editor.add_field(
JobHierarchy,
models.ForeignKey(Job, on_delete=models.CASCADE, related_name='ancestor_jobs', db_column='ancestor_id'),
)
schema_editor.add_field(
JobHierarchy,
models.ForeignKey(Job, on_delete=models.CASCADE, related_name='descendant_jobs', db_column='descendant_id'),
)
class Migration(migrations.Migration):
dependencies = [
('api', '0002_create_jobs'),
]
operations = [
migrations.CreateModel(
name='JobHierarchy',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('account_id', models.IntegerField()),
('level', models.IntegerField()),
],
options={
'db_table': 'job_hierarchies',
},
),
migrations.RunPython(add_foreign_keys),
]
Когда я запускаю make migrations, я получаю следующую ошибку
File "/app/api/migrations/0009_create_job_hierarchies.py", line 8, in add_foreign_keys
schema_editor.add_field(
File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/schema.py", line 730, in add_field
"name": self._fk_constraint_name(model, field, constraint_suffix),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/schema.py", line 1708, in _fk_constraint_name
[field.column],
^^^^^^^^^^^^
AttributeError: 'ForeignKey' object has no attribute 'column'. Did you mean: 'db_column'?
Я новичок в Python + django, поэтому любая помощь будет оценена по достоинству.
Обновления
Ранее у меня была миграция, как показано ниже, которая не вызывала проблем с миграцией, но вызывала проблемы, когда я пытался вставить объект Job
class Migration(migrations.Migration):
dependencies = [
('api', '0009_create_job_hierarchies'),
]
operations = [
migrations.CreateModel(
name='Tenure',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('employee', models.ForeignKey(on_delete=models.deletion.CASCADE, to='api.Employee')),
('job', models.ForeignKey(on_delete=models.deletion.CASCADE, to='api.Job')),
('date_of_joining', models.DateField()),
('date_of_exit', models.DateField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'tenures',
}
),
]
т.е. ошибка была связана только с колонкой-предком