Поддерживает ли 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']),
Вернуться на верх