Django Abstract Class меняет поведение в соответствии с реальным классом - PullRequest
0 голосов
/ 26 января 2019

Я думаю, что следующий код объясняет, что я пытаюсь сделать

from django.db import models


class MyBaseClass(models.Model):
    type = models.IntegerField()

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        self.type = #What Should I write here?#
        self.type = self.class.type ?
        super().save(*args, **kwargs)


class Model1(MyBaseClass):
    TYPE = 1


class Model2(MyBaseClass):
    TYPE = 2

Я хочу убедиться, что следующие утверждения работают:

instance1 = Model1.objects.create()
assert(instance1.type, 1)
instance2 = Model2.objects.create()
assert(instance1.type, 2)

Как я могу сделать эту работу?Спасибо.

1 Ответ

0 голосов
/ 26 января 2019

Установка значения по умолчанию унаследованных моделей

Если вы хотите установить по умолчанию для унаследованных моделей, вы можете обезопасить их.Например:

class Model1(MyBaseClass):
    TYPE = 1


class Model2(MyBaseClass):
    TYPE = 2

Model1._meta.get_field('type').default = Model1.TYPE
Model2._meta.get_field('type').default = Model2.TYPE

Добавление статического атрибута к моделям

В случае, если .type всех Model1 объектов равно всегда 1, и дляModel2 объекты это всегда 2, тогда нет никакой причины хранить эти типы в базе данных.Эти модели хранятся в разных таблицах, поэтому тот факт, что запись происходит из таблицы app_model1, «подразумевает» это.В этом случае вы можете установить атрибут класса, например:

class MyBaseClass(models.Model):
    type = <b>None</b>

    class Meta:
        abstract = True


class Model1(MyBaseClass):
    <b>type = 1</b>


class Model2(MyBaseClass):
    <b>type = 2</b>
...