Django: Переопределение унаследованных опций поля

Я работаю с Django 3.2 и хочу создать абстрактный класс с 2 полями, значения которых по умолчанию (или их пустой атрибут) могут меняться в каждом из дочерних классов.

Я бы хотел не переопределять полностью поля, а только те опции, которые меняются. Таким образом, если в будущем я решу сделать поле иконки уникальным, я должен буду изменить только родительский абстрактный класс, а не все дочерние модели.

# behaviors.py

from django.db import models
from colorfield.fields import ColorField


class Representable(models.Model):
    color = ColorField(_("color in the app"), blank=True)
    icon = models.CharField(_("icon in the app"), max_length=50, blank=True)

    class Meta:
        abstract = True
# models.py

from django.db import models
from .behaviors import Representable


class Item(Representable, models.Model):
    name = models.CharField(_("name"), max_length=50, blank=False)
    # color couldn't be blank
    # icon couldn't be blank    

    class Meta:
        verbose_name = _("item")
        verbose_name_plural = _("items")


class Tag(Representable, models.Model):
    name = models.CharField(_("name"), max_length=200, blank=False, unique=True)
    # color default value shoud be #00AEC7 (but could be blank)
    # icon default value shoud be mdi-label (but could be blank)    

    class Meta:
        verbose_name = _("tag")
        verbose_name_plural = _("tags")

Есть идеи?

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

class Tag(Representable):
    ...
    color = ColorField(_("color in the app"), blank=True, default='#00AEC7')
    icon = models.CharField(_("icon in the app"), max_length=50, blank=True, default='mdi-label')

Не эксперт, но это может сработать:

from django.db import models
from .behaviors import Representable


class Item(Representable):
    name = models.CharField(_("name"), max_length=50, blank=False, null=True)
    color = ColorField(_("color in the app"), blank=False)
    icon = models.CharField(_("icon in the app"), max_length=50, blank=False)   

    class Meta:
        verbose_name = _("item")
        verbose_name_plural = _("items")


class Tag(Representable):
    name = models.CharField(_("name"), max_length=200, blank=False, unique=True)
    color = ColorField(_("color in the app"), blank=True,null=True, default='#00AEC7')
    icon = models.CharField(_("icon in the app"), max_length=50, blank=True, null=True, default='mdi-label')   

    class Meta:
        verbose_name = _("tag")
        verbose_name_plural = _("tags")

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