我想用一个模型来保存django应用程序的系统设置,所以我想限制模型只能有一条记录,怎么做限制?
答案 0 :(得分:7)
试试这个:
class MyModel(models.Model):
onefield = models.CharField('The field', max_length=100)
class MyModelAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
# if there's already an entry, do not allow adding
count = MyModel.objects.all().count()
if count == 0:
return True
return False
答案 1 :(得分:7)
覆盖has_add_permission
有效,但在给定的示例中,它破坏了Django中的权限系统(没有必要权限的人员可以添加设置)。这是一个没有打破它的人:
class SettingAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
base_add_permission = super(SettingAdmin, self).has_add_permission(request)
if base_add_permission:
# if there's already an entry, do not allow adding
count = Setting.objects.all().count()
if count == 0:
return True
return False
答案 2 :(得分:5)
一种简单的方法是使用设置的名称作为设置表中的主键。不能有多个具有相同主键的记录,因此这将允许Django和数据库保证完整性。
答案 3 :(得分:4)
威廉是对的,但我想这是最好的做法
def has_add_permission(self, *args, **kwargs):
return not MyModel.objects.exists()
正如官方Django文档中所报道的那样:
注意:如果您只想确定是否存在至少一个结果,请不要使用此选项。 使用exists()更有效率。
https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated
答案 4 :(得分:1)
具有单个允许行的模型只不过是“持久对象”的变态形式 - 甚至可能是“持久单身”?不要这样做,这不是模型的工作方式。
答案 5 :(得分:0)
您可以在模型上重写save方法。每当用户想要注册新记录时,您都可以检查是否存在,然后保存记录或拒绝请求。
class MyModel(models.Model):
title = models.CharField(...)
body = models.TextField(...)
def save(self, *args, **kwargs):
if MyModel.objects.exists():
raise ValueError("This model has already its record.")
else:
super().save(*args, **kwargs)
您也可以使用validators。我更喜欢使用这种方法。 希望您觉得有用。