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

zho*_*shu 3 python django

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

mpe*_*rwe 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
Run Code Online (Sandbox Code Playgroud)


Umu*_*acı 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*lla 5

一种简单的方法是使用设置的名称作为设置表中的主键.不能有多个具有相同主键的记录,因此这将允许Django和数据库保证完整性.

  • 这是最正确的答案。其他建议仅影响管理员,但这将在保存对象时解决。然而,该名称不必是主要的,只要是唯一的即可。 (2认同)

小智 5

威廉是对的,但我想这是最佳做法

def has_add_permission(self, *args, **kwargs):
    return not MyModel.objects.exists()
Run Code Online (Sandbox Code Playgroud)

如官方Django文档中所述:

注意:如果您要做的只是确定是否存在至少一个结果,请不要使用它。使用exist()更有效。

https://docs.djangoproject.com/zh-CN/dev/ref/models/querysets/#when-querysets-are-evaluated