2012-10-18 4 views
1

모델에서 나는 일반적으로 친숙한 URI에 대한 "uuid"필드와 "slug"필드를 넣습니다. Django 추상 모델 상속

내가이 저장 될 때의 저장() 메소드를 재정 의하여 "SomeModel"라는 이름의 모델, 나는 UUID 및 슬러그를 생성 할 수있는 말 : 그것은 일반 모델에 잘 작동

class SomeModel(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
     if not self.uuid: 
      uuid = shortuuid.uuid()[:10] 
      while SomeModel.objects.filter(uuid=uuid).exists(): 
       uuid = shortuuid.uuid()[:10] 
      self.uuid = uuid 
     if not self.slug: 
      self.slug = slugify(self.title)[:500].rstrip('-') 
     super(SomeModel, self).save(*args, **kwargs) 

. 다음

class SomeAbstractModel(models.Model): 
    class Meta: 
     abstract = True 
    def save(self, *args, **kwargs): 
     ... 

: 그리고 지금은 추상적 인 모델을 가지고 싶습니다 난 그냥 간단하게 대체 할 수처럼

class SomeModel(SomeAbstractModel): 
    class Meta(SomeAbstractModel.Meta): 
     ... 

문제는 추상적 모델에서 보이는됩니다

while SomeModel.objects.filter(uuid=uuid).exists(): 

while SomeAbstractModel.objects.filter(uuid=uuid).exists(): 

becau se 추상 모델에는 관리자가 없습니다.

이 경우 궁금한 점은 모든 모델의 save() 메소드에서 중복 코드가 발생하는 것을 피할 수있는 방법입니다. 또한 확실하지 않은 경우

while SomeModel.objects.filter(uuid=uuid).exists(): 

은 uuid가 있는지 여부를 확인하는 가장 좋은 방법입니다. 당신이 SomeModel (SomeAbstractModel)를 만들 때, 단지 상속하지 않고 처음부터 클래스 메타를 만들

while self.__class__.objects.filter(...): 
    pass 

답변

3

확실하지. vom SomeAbstractModel.Meta를 상속하면 추상화됩니다. 관리자가 없기 때문에 추상 모델을 쿼리 할 수는 없지만 생성 된 테이블이 없기 때문에 쿼리 할 수 ​​없습니다.

그래서 하나이 수행

class SomeModel(SomeAbstractModel): 
    ... 
    class Meta(SomeAbstractModel.Meta): 
     abstract=False 
     ... your other model specific options 

을 또는 당신은 당신이 다른 모델 특정 옵션이없는 경우 (이 작업을 수행합니다.! 마법처럼

class SomeModel(SomeAbstractModel): 
    ... 
+0

작품을 감사 – devfeng

-1

:이 마을에서 가장 예쁜 방법입니다하지만이 작업을해야하는 경우

+1

에게 장고 설정합니다 abstract to False 기본적으로 : https://docs.djangoproject.com/en/1.4/topics/db/models/#meta-inheritance – devfeng

+0

네, SomeAbstractModel.Meta로부터 상속받은 경우 abstract가 true로 설정됩니다. 그래서 기본값은 관련성이 없으며 그 이유가 정확히 SomeModel이 여전히 추상적 인 이유입니다 – schacki

+0

@schacki가 틀렸어. 메타 추가 없이도 SomeModel은 여전히 ​​추상이 아닐거야. –

관련 문제