Ограничить одну запись в модели для приложения Django? - PullRequest
3 голосов
/ 21 января 2010

Я хочу использовать модель для сохранения настроек системы для приложения django, поэтому я хочу ограничить модель только одной записью, как сделать ограничение?

Ответы [ 5 ]

7 голосов
/ 16 ноября 2014

Перезапись 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
7 голосов
/ 11 ноября 2011

Попробуйте это:

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
5 голосов
/ 21 января 2010

Простой способ - использовать имя настройки в качестве первичного ключа в таблице настроек. Не может быть больше одной записи с одним и тем же первичным ключом, так что это позволит и Django, и базе данных гарантировать целостность.

4 голосов
/ 10 марта 2014

Уильям прав, но я думаю, что это лучшая практика

def has_add_permission(self, *args, **kwargs):
    return not MyModel.objects.exists()

Как сообщается в официальной документации Django:

Примечание: не используйте это, если все, что вы хотите сделать, это определить, существует ли хотя бы один результат. Существует более эффективный способ использования ().

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

1 голос
/ 29 июня 2011

Модель с единственной разрешенной строкой - не более чем извращенная форма «сохраняемого объекта» - может быть, даже «сохраненного синглтона»?Не делайте этого, это не так, как работают модели.

Проверьте https://github.com/danielroseman/django-dbsettings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...