データベースモデルを使用してプロジェクトの設定を制御したいと思っています。例えば:誰かが誤って新しいインスタンスを作成した場合、それは世界の終わりではありません、もちろんDjangoでモデルのインスタンスを1つだけ許可する
juicer_base = JuicerBaseSettings()
juicer_base.save()
:
class JuicerBaseSettings(models.Model):
max_rpm = model.IntegerField(default=10)
min_rpm = model.IntegerField(default=0)
はこのモデルの1つのインスタンスがあるはずです。私はちょうどJuicerBaseSettings.objects.all().first()
をすることができます。しかし、1つ以上のインスタンスを作成することが不可能なように、ロックする方法はありますか?
SOに関する2つの関連する問題が見つかりました。 This answerは、django-singletons
などのサードパーティのアプリを使用することを提案していますが、これは積極的に維持されていないようです(git repoの最終更新は5年前です)。 Another answerは、許可またはOneToOneField
のいずれかの組み合わせを使用することを推奨しています。どちらも2010年から2011年の回答です。
これ以来Djangoが大きく変わったことを考えると、この問題を解決する標準的な方法はありますか?または、私はちょうど.first()
を使用して、重複があるかもしれないと受け入れるべきですか?私は専門家ではないよ
class JuicerBaseSettings(models.Model):
def save(self, *args, **kwargs):
if JuicerBaseSettings.objects.exists() and not self.pk:
# if you'll not check for self.pk
# then error will also raised in update of exists model
raise ValidationError('There is can be only one JuicerBaseSettings instance')
return super(JuicerBaseSettings, self).save(*args, **kwargs)
を...またはあなたが 'に.getを行うことができます(PK = 1)'代わりに... – Bakuriu
これはデータベースには全くありません – e4c5
@ e4c5合理的ですが、小規模なプロジェクトでは、私はいつもそのようなサイト設定に直面しています。これは、管理者のクライアント変更、電話番号やプロジェクト関連のものなどです。多分もっと良い方法を指しているかもしれません –