我想在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模式的示例。