2016-10-22 6 views
2

추상 모델과의 관계를 테스트하는 데 시간이 걸리자 항복했지만 다행히도 시도했지만 GenericForeignKey를 사용해 보았습니다. 행운을 빌어 요, 여기 내 코드는추상 모델과의 필드 관계 정의

입니다. 내가 GenericForeignKey을 시도했을 때
class Attribute(models.Model): 
    name  = models.CharField(max_length=50) 


class TemplateField(models.Model): 
    name = models.CharField(null=True,blank=True,max_length=30) 
    attributes = models.ManyToManyField(Attribute, through='AttributeValue') 

    class Meta: 
     abstract = True 


class Domain(TemplateField): 
    name = models.CharField(max_length=33) 



class AttributeValue(models.Model): 
    templatefield  = models.ForeignKey(TemplateField) 
    attribute = models.ForeignKey(Attribute) 
    value  = models.CharField(max_length=50) 

, 내 "도메인"모델과 방법을 수정하는 방법과 함께 할 무엇 확실하지 않았다, 당신은 내가 아래의 오류를 얻고 알고 [makemigrate 동안] :

wiki.AttributeValue.templatefield: (fields.E300) Field defines a relation with model 'TemplateField', which is either not installed, or is abstract. 
wiki.AttributeValue.templatefield: (fields.E307) The field wiki.AttributeValue.templatefield was declared with a lazy reference to 'wiki.templatefield', but app 'wiki' doesn't provide model 'templatefield'. 
wiki.AttributeValue: (fields.E336) The model is used as an intermediate model by 'wiki.Domain.attributes', but it does not have a foreign key to 'Domain' or 'Attribute'. 

답변

2

좋아, 쉬운 대답은 "당신이하고있는 일을 고칠 수 없다"입니다. 진짜가 아닌 무언가에 oreign 키 필드 (TemplateField는 추상적이라는 것은 생성되지 않을 것이라는 것을 의미합니다).

나는 생각합니까? TemplateField 은 추상적 인 것으로을 가지고 있습니다. Django는 모델에 대한 상속을 상당히 잘 처리합니다. 즉, 추가 Db 테이블을 가지고 있음을 의미하지만 '괜찮습니다.'

템플릿 필드가 '어떤 종류의 템플릿 필드'인지 알기 위해 TemplateField에 더 많은 기능을 추가하는 것을 고려해 볼 수 있습니다. 예를 들어 Templatefield '3'을로드하려고하면 도메인을 알고 반환합니다. 인스턴스가 템플릿의 여러 유형 상속을 가질 수있게합니다.

관련 문제