2016-09-09 4 views
4

데이터베이스 모델을 사용하여 프로젝트의 일부 구성 설정을 제어하고 싶습니다. 예를 들어 :Django에서 하나의 모델 인스턴스 만 허용

class JuicerBaseSettings(models.Model): 
    max_rpm = model.IntegerField(default=10) 
    min_rpm = model.IntegerField(default=0) 

만이 모델의 인스턴스가 있어야한다 : 누군가가 실수로 새 인스턴스를 만드는 경우 물론

juicer_base = JuicerBaseSettings() 
juicer_base.save() 

, 그것은 세상의 종말이 아니다. 나는 단지 JuicerBaseSettings.objects.all().first()을 할 수 있었다. 그러나 인스턴스를 두 개 이상 만들지 못하도록 잠글 수있는 방법이 있습니까?

나는 두 가지 관련 질문을 발견했습니다. This answerdjango-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

을 ... 또는'갔지을 할 수있는 (PK = 1)'대신 ... – Bakuriu

+3

이것은 데이터베이스에 전혀 존재하지 않아야합니다. – e4c5

+1

@ e4c5 합리적입니다.하지만 소규모 프로젝트에서는 관리자가 클라이언트 변경을 허용하는 사이트 설정과 항상 직면 해 있습니다. 예를 들어 전화 번호 또는 기타 프로젝트 관련 항목이 있습니다. 어쩌면 당신은 더 나은 방법을 가리킬 것입니다 –

답변

6

당신은 인스턴스의 수를 제어 할 수 save 방법을 대체 할 수 있습니다 인스턴스는, 만약 그렇다면 저장() 메소드는 그렇지 않은 경우 super()를 호출, 반환합니다.

2

하지만 난 이미이 있었는지는 확인합니다 있도록 모델의 저장() 메소드를 덮어 쓸 수 있습니다 같아요

+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 
관련 문제