Как сохранить введенный текст в виде списка в админке Django

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

Итак, имея колонку базы данных origins_asns в PostgreSQL, определенную как массив целых чисел

origin_asns   BIGINT[] DEFAULT '{}',

Соответствующая модель должна выглядеть примерно так

    class DynCdn(models.Model):
...
        origin_asns = models.CharField(
            verbose_name="Origin ASNs",
            help_text="Hint: use a space ' ' character to enter multiple ASNs.",
            max_length=64,
        )
        interfaces = ChoiceArrayField(
            base_field=models.CharField(
                max_length=64,
                choices=DYNCDN_INTERFACES,
            ),
            default=list,
        )
...
    
        def save(self, *args, **kwargs):
...
            if self.origin_asns is not None:
                self.origin_asns = [
                    int(_) for _ in self.origin_asns.split() if _.isdigit()
                ]
            return super(DynCdn, self).save(*args, **kwargs)
...
<
Jun 08 10:21:33 __ registry[61043]: django.db.utils.DataError: malformed array literal: "[101, 202, 303]"
Jun 08 10:21:33 __ registry[61043]: LINE 1: ...2f5c910bfd4f'::uuid, 'JSHGSAVS', '101, 202, 303', '[101, 202...
Jun 08 10:21:33 __ registry[61043]:                                                              ^
Jun 08 10:21:33 __ registry[61043]: DETAIL:  Missing "]" after array dimensions.

Похоже, что список приводится к строке. Не будете ли вы так добры, как решить эту проблему?

Имея ChoiceArrayField определено так:

class ChoiceArrayField(ArrayField):
    def formfield(self, **kwargs):
        defaults = {
            "form_class": forms.MultipleChoiceField,
            "choices": self.base_field.choices,
        }
        defaults.update(kwargs)
        return super(ArrayField, self).formfield(**defaults)

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

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