限制要创建的模型实例的数量 - django

vor*_*pyg 24 django django-models django-admin

我有模型,我只想创建一个实例,不应再允许实例.

这可能吗?我有一种感觉,我已经在某处看到过这种情况,但不幸的是我无法找到它.

编辑:我需要这个愚蠢的简单CMS.我有一个FrontPage和Page类继承的抽象类.我只想创建一个frontpage对象.

FrontPage对象和Page对象之间的区别在于它们应该具有稍​​微不同的字段和模板,并且如上所述,仅创建一个FrontPage.

nco*_*lan 30

我想自己做类似的事情,发现Django的模型验证提供了一个方便的执行钩子:

from django.db import models
from django.core.exceptions import ValidationError

def validate_only_one_instance(obj):
    model = obj.__class__
    if (model.objects.count() > 0 and
            obj.id != model.objects.get().id):
        raise ValidationError("Can only create 1 %s instance" % model.__name__)

class Example(models.Model):

    def clean(self):
        validate_only_one_instance(self)
Run Code Online (Sandbox Code Playgroud)

这不仅阻止了新实例的创建,而且Django管理UI实际上会报告创建失败,原因是"只能创建1个示例实例"(而文档中的早期返回方法没有说明为什么保存不起作用).


Bre*_*dan 23

如果您只是想阻止使用管理界面的用户创建额外的模型对象,您可以修改模型的ModelAdmin类的"has_add_permission"方法:

# admin.py
from django.contrib import admin
from example.models import Example

class ExampleAdmin(admin.ModelAdmin):
  def has_add_permission(self, request):
    num_objects = self.model.objects.count()
    if num_objects >= 1:
      return False
    else:
      return True

admin.site.register(Example, ExampleAdmin)
Run Code Online (Sandbox Code Playgroud)

这将删除管理界面中的"添加"按钮,防止用户甚至尝试创建超过指定数量(在本例中为1).当然,编程添加仍然是可能的.


Dom*_*ger 3

你可以从 Django 文档中执行以下操作:

class ModelWithOnlyOneInstance(models.Model):
    ... fields ...

    def save(self, *args, **kwargs):
      if ModelWithOnlyOneInstance.objects.count() > 1:
        return

      super(ModelWithOnlyOneInstance, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 这并不能保证最多会创建一个实例 - 除非只有一个线程/进程。 (3认同)