【发布时间】:2010-01-21 03:58:43
【问题描述】:
我想用一个模型来保存一个django应用的系统设置,所以我想限制模型只能有一条记录,怎么做限制?
【问题讨论】:
标签: python python-3.x django django-models django-admin
我想用一个模型来保存一个django应用的系统设置,所以我想限制模型只能有一条记录,怎么做限制?
【问题讨论】:
标签: python python-3.x django django-models django-admin
看起来像 Ali Reza 的答案,但您可以更新现有记录并将错误消息返回到使用此模型的任何表单。我相信它可靠且易于控制。
class MyModel(models.Model):
...
def clean(self):
super().clean()
if not self.id and MyModel.objects.exists():
raise ValidationError('You cannot add more somethings.')
【讨论】:
覆盖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
【讨论】:
一种简单的方法是使用设置名称作为设置表中的主键。具有相同主键的记录不能超过一条,这样可以让 Django 和数据库都保证完整性。
【讨论】:
William 是对的,但我想这是最佳做法
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
【讨论】:
试试这个:
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
【讨论】:
具有单个允许行的模型只不过是“持久对象”的变态形式——甚至可能是“持久单例”?不要那样做,这不是模型的工作方式。
【讨论】:
您可以在模型上重写保存方法。每当用户想要注册新记录时,您可以检查是否存在,然后保存记录或拒绝请求。
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。我更喜欢使用这种方法。 希望对您有用。
【讨论】:
使用 "has_add_permission()" 是最简单也是最好的方法:
“models.py”:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
“admin.py”:
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return not MyModel.objects.exists()
您可以查看有关has_add_permission()的文档。
【讨论】: