gpt4 book ai didi

python - 如何将默认值数组添加到 ArrayField?

转载 作者:行者123 更新时间:2023-12-04 11:45:11 25 4
gpt4 key购买 nike

是否可以为 ArrayField 添加默认值?

我尝试为电子邮件字段执行此操作,但这不起作用:

常量.py:

ORDER_STATUS_CHANGED = 'order_status_changed'
NEW_SIGNAL = 'new_signal'

NOTIFICATION_SOURCE = (
(ORDER_STATUS_CHANGED, 'Order Status Changed'),
(NEW_SIGNAL, 'New Signal'),

)

模型.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
列表 instead of []``

最佳答案

default ArrayField 上的属性(property)应该是可调用的。您可以在此处阅读更多相关信息: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)

通过这样做,警告将消失,您可以从函数中获得选择默认值的逻辑。

执行此操作后,在迁移中,默认值将如下所示:
default=my_model.models.get_email_default

关于python - 如何将默认值数组添加到 ArrayField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60779234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com