我想在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中注册了Class,然后在admin中查看了表。没有行。我不知道加载类方法不起作用或未调用加载。一旦设置了行,就不再需要了。我测试了删除。我问我是否确定要删除它。我选择了。此后那排仍然在那里。

最佳答案

基本上,您正在尝试在Django模型中实现Singleton模式。因此,您可以在此处覆盖save方法:

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)


答案基于此article,您可以在其中找到一些有关如何在Django模型中使用Singleton模式的示例。

10-08 12:03