Наследовать модели с отдельным первичным ключом в модели django - PullRequest
1 голос
/ 05 мая 2020

У меня есть абстрактная модель, которую я хочу, чтобы все мои модели унаследовали от нее:

from django.db import models


class Audit(models.Model):
    create_date = models.DateTimeField(auto_now_add=True)
    last_modify_date = models.DateTimeField(auto_now=True)
    create_by = models.CharField(null=True, max_length=50)
    last_modify_by = models.CharField(null=True, max_length=50)

    class Meta:
        abstract: True

теперь, например, у меня есть две модели:

from general.AuditableModel import Audit


class Province(Audit):
    name = models.CharField(max_length=30)

    class Meta:
        db_table = 'province_v2'
        verbose_name_plural = _('provinces')
        verbose_name = _('province')


class City(Audit):
    province_id = models.ForeignKey('address.Province', on_delete=models.CASCADE, related_name='cities')
    name = models.CharField(max_length=30)

    class Meta:
        db_table = 'city_v2'
        verbose_name_plural = _('cities')
        verbose_name = _('city')

в моей базе данных он делает таблицы вроде этого:

create table province_v2
(
    audit_ptr_id integer     not null
        primary key
        references general_audit
            deferrable initially deferred,
    name         varchar(30) not null
);

create table city_v2
(
    audit_ptr_id   integer     not null
        primary key
        references general_audit
            deferrable initially deferred,
    name           varchar(30) not null,
    province_id_id integer     not null
        references province_v2
            deferrable initially deferred
);

create index city_v2_province_id_id_12975070
    on city_v2 (province_id_id);


но я хочу, чтобы мои модели были независимыми id integer primary key без абстрактной таблицы, теперь он сделал таблицу general_audit

1 Ответ

2 голосов
/ 05 мая 2020

Вы случайно создали не абстрактную модель. Действительно, чтобы присвоить переменную, вы используете уравнение sybol (=). Вместо этого вы использовали двоеточие (:). Это означает, что вы создали настоящую таблицу в базе данных для Audit и, таким образом, использовали механизм наследования Django.

Таким образом, вы должны написать abstract <b>=</b> True:

class Audit(models.Model):
    create_date = models.DateTimeField(auto_now_add=True)
    last_modify_date = models.DateTimeField(auto_now=True)
    create_by = models.CharField(null=True, max_length=50)
    last_modify_by = models.CharField(null=True, max_length=50)

    class Meta:
        # <i>not</i> :
        <b>abstract = True</b>
...