Как я могу наследовать другую модель после создания одной с помощью models.Model, [(models.Model) ---> (BaseModel)].

Я создал такую модель.

class BloodDiscard(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)
    created_by = models.ForeignKey(Registration, on_delete=models.SET_NULL, null=True)
    blood_group = models.ForeignKey(BloodGroupMaster, on_delete=models.SET_NULL, null=True)
    blood_cells = models.ForeignKey(BloodCellsMaster, on_delete=models.SET_NULL, null=True)
    quantity = models.FloatField()

Но теперь мне нужно применить наследование к моей модели, вот так. [(models.Model) ---> (BaseModel)]

class BloodDiscard(BaseModel):
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)
    created_by = models.ForeignKey(Registration, on_delete=models.SET_NULL, null=True)
    blood_group = models.ForeignKey(BloodGroupMaster, on_delete=models.SET_NULL, null=True)
    blood_cells = models.ForeignKey(BloodCellsMaster, on_delete=models.SET_NULL, null=True)
    quantity = models.FloatField()

BaseModel - это другая модель, которую я создал ранее, но забыл унаследовать ее в моей текущей модели.

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status_master = models.ForeignKey(StatusMaster,on_delete=models.SET_NULL,default=3,null=True, blank=True)

Я применил "python manage.py makemigrations" после изменения (models.Model) ---> (BaseModel) и получил следующее...

(venv) G:\office\medicover\medicover_bloodbank_django>python manage.py makemigrations
You are trying to add the field 'created_at' with 'auto_now_add=True' to blooddiscard without a default; the database needs something to populate existing rows.

 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
[default: timezone.now] >>>
Migrations for 'Form':
  Form\migrations\0018_auto_20220622_2322.py
    - Add field created_at to blooddiscard
    - Add field status_master to blooddiscard
    - Add field updated_at to blooddiscard

Но после этого, когда я применяю "python manage.py migrate". я получаю эту ошибку.

При выполнении команды "python manage.py runserver" получаем следующее...

(venv) G:\office\medicover\medicover_bloodbank_django>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): Form.
Run 'python manage.py migrate' to apply them.
June 22, 2022 - 23:23:51
Django version 3.2.5, using settings 'App.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

ПРИМЕЧАНИЕ:- В таблице StatusMaster есть только две строки с идентификаторами 1 и 2.

Это не сработает, поскольку BaseModel является неабстрактной моделью, и поэтому BaseModel и BloodDiscard разделяют одно и то же "пространство первичных ключей": первичный ключ BloodDiscard является ForeignKey к первичному ключу BaseModel.

Вероятно, вы не хотите, чтобы BaseModel была не абстрактной моделью, а абстрактной, поэтому вы можете переписать BaseModel на:

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status_master = models.ForeignKey(
        StatusMaster,
        on_delete=models.SET_NULL,
        default=3,
        null=True,
        blank=True
    )

    class Meta:
        abstract = True

Удалите проблемный файл миграции, создайте новый файл миграции и выполните миграцию.

Это ошибка, которую я получал:-

django.db.utils.IntegrityError: insert or update on table "Form_blooddiscard" violates foreign key constraint "Form_blooddiscard_status_master_id_ffe293fa_fk_Master_st" ПОДРОБНАЯ ИНФОРМАЦИЯ: Ключ (status_master_id)=(3) отсутствует в таблице "Master_statusmaster".

как мы видим:... ДЕТАЛЬ: Ключ (status_master_id)=(3) отсутствует в таблице "Master_statusmaster".

он говорит мне, что в status_master нет "id" (PK), имеющего значение "3".

однако, в моей базовой модели:-

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status_master = 

models.ForeignKey(StatusMaster,on_delete=models.SET_NULL,default=3,null=True, blank=True)

кто-то предоставил значение по умолчанию "3" для "status_master", которого не существует. Поэтому я просто удалил значение по умолчанию, и проблема была решена.

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