Как ограничить таблицу моделей Django одной строкой - PullRequest
1 голос
/ 18 февраля 2020

Я хочу создать таблицу с одной строкой в ​​базе данных MySQL. Это для настроек сайта. Это SQL для него, который я нашел в другом вопросе на этом сайте:

CREATE TABLE T1(
Lock char(1) not null DEFAULT 'X',
/* Other columns */,
constraint PK_T1 PRIMARY KEY (Lock),
constraint CK_T1_Locked CHECK (Lock='X')
)

Могу ли я сделать это в программе Django модель? Пока у меня есть:

from django.db import models

class Settings(models.Model):
    lock = models.CharField(max_length=1, null=False, primary_key=True, default='X')
    employer_day_date = models.DateField

    class Meta:
        constraints = [CheckContraint()]

Я могу добавить класс Meta: к нему, но PyCharm не распознает CheckConstraint, поэтому я не пошел дальше. У меня нет проблем сделать это в SQL, если это единственный способ.

Я думал об изменении базы данных после миграции, но она казалась довольно грубой.

Решение

Я использовал код @ruddra и некоторые из статьи, которую он разместил:

class SiteSettings(models.Model):
lock = models.CharField(max_length=1, null=False, primary_key=True, default='X')
employer_day_date = models.DateField()

def save(self, *args, **kwargs):
   self.pk = 'X'
   super().save(*args, **kwargs)

def delete(self, *args, **kwargs):
   pass

@classmethod
def load(cls):
    obj, created = cls.objects.get_or_create(pk='X')
    return obj

После выполнения миграции я зарегистрировал класс в admin, а затем просмотрел таблицу в admin. Там не было никаких рядов. Я не знаю, не работал ли метод класса загрузки или не вызывался load. Как только ряд настроен, он больше не нужен. Я проверил удаление. Я спросил, уверен ли я, что хочу удалить его. Я выбрал да. Ряд был еще там потом.

1 Ответ

1 голос
/ 18 февраля 2020

В основном вы пытаетесь достичь одноэлементной модели в Django моделях. Итак, здесь вы можете переопределить метод сохранения здесь:

from django.db import models

class Settings(models.Model):
    lock = models.CharField(max_length=1, null=False, primary_key=True, default='X')
    employer_day_date = models.DateField()

    def save(self, *args, **kwargs):
       self.pk = 'X'
       super().save(*args, **kwargs)

Ответ основан на этой статье , там вы можете найти несколько хороших примеров того, как использовать шаблон Singleton в моделях Django.

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