Как добавить массив значений по умолчанию в ArrayField? - PullRequest
0 голосов
/ 20 марта 2020

Можно ли добавить значение по умолчанию для ArrayField?

Я пытался сделать это для поля электронной почты, но это не сработало:

constants.py:

* 1006 Я думаю, *

models.py:

from notifications import constants
from django.contrib.postgres.fields import ArrayField

class NotificationSetting(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='notification_setting')

    telegram = ArrayField(models.CharField(
        choices= constants.NOTIFICATION_SOURCE,
        max_length=30
    ), default=list)

    email = ArrayField(models.CharField(
        choices= constants.NOTIFICATION_SOURCE,
        max_length=16
    ), default=list(dict(constants.NOTIFICATION_SOURCE).keys()))

    class Meta:
        db_table = 'notification_settings'

    def __str__(self):
        return f'Notification setting for user {self.user}'

И переопределение метода сохранения модели было бы плохой практикой.

Проблема в том, что на сайте администратора django Я вижу, что значения по умолчанию не учитывались при создании объекта. (UPD. Maibe, у меня есть проблема с моим пользовательским ChoiseArrayField с надписью)

И я получаю это сообщение: WARNINGS: notifications.NotificationSetting.email: (postgres.E003) ArrayField default should be a callable instead of an instance so that it's not shared between all field instances. HINT: Use a callable instead, e.g., use list instead of [] ``

1 Ответ

0 голосов
/ 22 марта 2020

Свойство default в ArrayField должно вызываться. Вы можете прочитать больше об этом здесь: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/.

То, что вы получаете, разместив прямо там list(dict(constants.NOTIFICATION_SOURCE).keys()), является всего лишь предупреждением, поэтому оно все равно должно добавить значения по умолчанию в поле. Поместив это значение по умолчанию непосредственно туда, оно добавит в миграции следующее, и значения будут общими для всех экземпляров поля:

default=['order_status_changed', 'new_signal']

Чтобы избавиться от предупреждения, вы должны создать функцию, которая возвращает значение по умолчанию значение:

def get_email_default():
    return list(dict(constants.NOTIFICATION_SOURCE).keys())

и поставить функцию в качестве поля по умолчанию:

email = ArrayField(models.CharField(
    choices= constants.NOTIFICATION_SOURCE,
    max_length=16
), default=get_email_default)

При этом предупреждение исчезнет, ​​и из функции вы получите logi c для выбора значения по умолчанию.

После этого в миграциях значение по умолчанию будет выглядеть так:

default=my_model.models.get_email_default
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...