2016-09-09 12 views
4

データベースモデルを使用してプロジェクトの設定を制御したいと思っています。例えば:誰かが誤って新しいインスタンスを作成した場合、それは世界の終わりではありません、もちろん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) 
+0

を...またはあなたが 'に.getを行うことができます(PK = 1)'代わりに... – Bakuriu

+3

これはデータベースには全くありません – e4c5

+1

@ e4c5合理的ですが、小規模なプロジェクトでは、私はいつもそのようなサイト設定に直面しています。これは、管理者のクライアント変更、電話番号やプロジェクト関連のものなどです。多分もっと良い方法を指しているかもしれません –

答えて

6

あなたは、インスタンスの数を制御するsaveメソッドをオーバーライドすることができますインスタンスは、もしそうであれば、保存()メソッドは、単にそれ以外の場合は、super()を呼び出します、戻ります。

2

しかし、私はすでにあった場合、それはチェックするように、あなたがモデルのsave()メソッドを上書きすることができますね。

+0

はい、私はこれが最良の答えであることに同意します。 save()を上書きし、pkがあるかどうかを確認します。もしそうであれば、それはアップデートであり、そうでない場合は正常です...次に、id = 1が存在するかどうかを確認するためにdBをチェックし、それに応じて処理します。 –

3

あなたはpre_save信号を使用することができます)(保存

@receiver(pre_save, sender=JuicerBaseSettings) 
def check_no_conflicting_juicer(sender, instance, *args, **kwargs): 
    # If another JuicerBaseSettings object exists a ValidationError will be raised 
    if JuicerBaseSettings.objects.exclude(pk=instance.pk).exists(): 
     raise ValidationError('A JuiceBaseSettings object already exists') 
+0

その場合、存在するインスタンスを更新することはできません –

+0

改訂コードを参照 –

0

の場合あなたのモデルはモデルの許可を追加するだけで、あなたはさらに、動的に設定することができますジャンゴ管理者に使用されます。

# some imports here 
from django.contrib import admin 
from myapp import models 

@admin.register(models.ExampleModel) 
class ExampleModelAdmin(admin.ModelAdmin): 

    # some code... 

    def has_add_permission(self, request): 
     # check if generally has add permission 
     retVal = super().has_add_permission(request) 
     # set add permission to False, if object already exists 
     if retVal and models.ExampleModel.objects.exists(): 
      retVal = False 
     return retVal 
関連する問題