限制django应用程序模型中的单个记录?

时间:2010-01-21 03:58:43

标签: python django

我想用一个模型来保存django应用程序的系统设置,所以我想限制模型只能有一条记录,怎么做限制?

6 个答案:

答案 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)

具有单个允许行的模型只不过是“持久对象”的变态形式 - 甚至可能是“持久单身”?不要这样做,这不是模型的工作方式。

查看https://github.com/danielroseman/django-dbsettings

答案 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。我更喜欢使用这种方法。 希望您觉得有用。