我想使用数据库模型控制项目的一些配置设置。例如:
class JuicerBaseSettings(models.Model):
max_rpm = model.IntegerField(default=10)
min_rpm = model.IntegerField(default=0)
此模型应该只有一个示例:
juicer_base = JuicerBaseSettings()
juicer_base.save()
当然,如果有人不小心创建了一个新的示例,也不是世界末日,我可以直接做JuicerBaseSettings.objects.all().first()
。但是,有没有办法锁定它,使其无法创建多个示例?
我在SO上发现了两个相关的问题。This answer建议使用第三方应用程序,如django-singletons
,这似乎没有被积极维护(最后一次更新git repo是5年前)。Another answer建议使用权限或OneToOneField
的组合。两个答案都是2010-2011年的。
鉴于Django从那时起已经改变了很多,有没有什么标准的方法来解决这个问题?或者我应该使用.first()
并接受可能存在重复的问题?
7条答案
按热度按时间gijlo24d1#
我在我的管理中做了这样的事情,所以我根本不会去原始的
add_new
视图,除非已经没有对象存在:仅在管理员保存时有效
zqdjd7g92#
你可以重写
save
方法来控制多个示例:cbjzeqam3#
您可以重写保存并创建一个类函数
JuicerBaseSettings.object()
======
简单地说,使用
django_solo
。https://github.com/lazybird/django-solo
Snippet Courtsy: django-solo-documentation.
5anewei64#
如果你的模型只在django-admin中使用,你还可以为你的模型设置动态 * 添加权限 *:
slhcrj9b5#
我不是一个Maven,但我猜你可以覆盖模型的保存()方法,这样它就会检查是否已经有一个示例,如果有,save()方法就会返回,否则它会调用super().save()
gdrx4gfi6#
可以使用pre_保存信号
vwoqyblh7#
我有点晚了,但是如果你想确保只创建一个对象的示例,修改模型保存()函数的另一种解决方案是在创建示例时总是指定ID为1-这样,如果示例已经存在,将引发完整性错误。
而不是:
它不像修改保存函数那样是一个干净的解决方案,但它仍然可以做到这一点。