我希望能够在运行时更改 settings.py 文件中定义的一些设置。还应保留更改(在服务器重新启动后)。我找到了https://github.com/jabapyth/django-appsettings但它缺乏对数组和元组的支持。有什么更好的吗?
设置不应在运行时更改。
这样做可能会导致线程问题和不一致,因为它们在初始化时由每个工作人员在开始时加载,因此您在一个进程中更改它们而其他进程没有更新的值。
https://docs.djangoproject.com/en/dev/topics/settings/#altering-settings-at-runtime
编辑
如果您设法将这些设置存储到数据模型中,则可以利用低级缓存系统,因此在数据更改并手动使这些值无效之前几乎不会发生查询。请参阅https://docs.djangoproject.com/en/1.3//topics/cache/#the-low-level-cache-api。
编辑 2
您可以添加一个非常简单和通用的设置模型,并通过管理界面或其他方式对其进行管理。
class Setting(models.Model):
name = models.CharField(max_length=100)
value = models.CharField(max_length=500)
value_type = models.CharField(max_length=1, choices=(('s','string'),('i','integer'),('b','boolean'))
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
def actual_value(self):
types = {
's': str,
'i':int,
'b': (lambda v: v.lower().startswith('t') or v.startswith('1'))
}
return types[self.value_type](self.value)
Run Code Online (Sandbox Code Playgroud)
对于站点范围的设置,附加到站点模型,对于特定于用户的设置,附加到用户等。
编辑 3
您可以使用 Manager 对象返回列表或字典:
class SettingManager(models.Manager):
def dict_for_object(self, object):
ct = ContentType.get_for_model(object)
pk = object.pk
return dict(self.filter(object_id=pk, content_type__id=ct.id).values_list('name', 'value'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2594 次 |
| 最近记录: |