【问题标题】:Limit a single record in model for django app?在 django 应用程序的模型中限制单个记录?
【发布时间】:2010-01-21 03:58:43
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x django django-models django-admin


    【解决方案1】:

    看起来像 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.')
    

    【讨论】:

      【解决方案2】:

      覆盖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
      

      【讨论】:

        【解决方案3】:

        一种简单的方法是使用设置名称作为设置表中的主键。具有相同主键的记录不能超过一条,这样可以让 Django 和数据库都保证完整性。

        【讨论】:

        • 这是最正确的答案。其他建议仅影响管理员,但这将在任何时候保存对象时解决。名称不必是主要的,但只要是唯一的即可。
        【解决方案4】:

        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

        【讨论】:

          【解决方案5】:

          试试这个:

          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
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            【解决方案7】:

            您可以在模型上重写保存方法。每当用户想要注册新记录时,您可以检查是否存在,然后保存记录或拒绝请求。

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

            【讨论】:

            • 限制编辑已有记录
            • 完全正确。谢谢。如果您尝试编辑现有记录,则不起作用。
            • 但是阿里,问题是要限制唯一的1条记录,而不是现有的。
            【解决方案8】:

            2022 年 3 月更新:

            使用 "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()的文档。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-17
              • 1970-01-01
              • 2020-02-03
              • 1970-01-01
              • 1970-01-01
              • 2020-05-13
              • 2011-12-22
              • 2017-10-21
              相关资源
              最近更新 更多