Поддерживает ли Django целочисленные перечисления для полей модели, аналогичные models.TextChoices?
Я использую Django 3.2, Python 3.9 и Postgres. У меня есть следующая модель, в которой я хочу ограничить одно из полей ("type"), чтобы оно было из предопределенного перечисления ...
class Transaction(models.Model):
class TransactionTypes(models.TextChoices):
BUY = 'BUY', _('Buy')
SELL = 'SELL', _('Sell')
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created = models.DateTimeField(null=False, default=datetime.now)
price = models.FloatField(null=False)
amount = models.FloatField(null=False)
type = models.CharField(
null=False,
max_length=5,
choices=TransactionTypes.choices,
)
class Meta:
indexes = [
models.Index(fields=['created']),
Однако, это немного неэффективно с точки зрения пространства, поскольку я использую символьный тип, когда, как мне кажется, я должен использовать целочисленный тип для перечислений. Есть ли в Django что-нибудь из коробки, что может вместить целочисленные типы перечислений?
Да, вы можете использовать choices
с IntegerField
. Вы можете использовать PositiveSmallIntegerField
(https://docs.djangoproject.com/en/3.2/ref/models/fields/#positivesmallintegerfield), чтобы еще больше экономить место. Вот пример с вашим кодом:
class Transaction(models.Model):
class TransactionTypes(models.TextChoices):
BUY = 1, _('Buy')
SELL = 0, _('Sell')
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created = models.DateTimeField(null=False, default=datetime.now)
price = models.FloatField(null=False)
amount = models.FloatField(null=False)
type = models.PositiveSmallIntegerField(
null=False,
choices=TransactionTypes.choices,
)
class Meta:
indexes = [
models.Index(fields=['created']),