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")