2014-01-23 4 views
0

에 저장 일반적인 필드는 좀 모델을 가지고 :장고 : 상위 모델

각 막대는 음료를 제공하고, 각 레스토랑은 식사를 제공 곳 구조를 상속 다중 테이블의
class Place(models.Model): 
    name = models.CharField(unique=True) 

class Bar(Place): 
    drinks = models.ManyToManyField('Drink') 

class Restaurant(Place): 
    meals = models.ManyToManyField('Meals') 

. 그러나 모든 장소에서 고유 한 각 장소의 이름이 필요합니다. 따라서 부모는 Place 모델입니다.

이제 다중 테이블 상속은 부모를 가정하고 자식은 별도의 엔터티입니다. 나는 새로운 Bar를 만들 때 내가 같이 가야한다, 의미

>> parent = Place(name='Myplace') 
>> parent.save() 
>> child = Bar(place=parent, drinks=mydrinklist) 
>> child.save() 

하지만 내 경우에는

Place은 별도의 법인되지 않습니다 : 그것은 그 자체로 존재한다. 일부 제한 사항이있는 공유 저장 용량 일뿐입니다. 나는 이런 식으로 뭔가를 싶습니다 name 속성이 자동으로 기본 상위 모델에 전달되고 save()가 호출 될 때 Place 모델이 자동으로 생성됩니다

>> child = Bar(name='Myplace', drinks=mydrinklist) 
>> child.save() 

. SQLAlchemy는 다중 테이블 상속을 통해이를 수행 할 수 있습니다. 장고에서 같은 것을 달성 할 수있는 방법이 있습니까?

class Place(models.Model): 
    name = models.CharField(unique=True) 

    class Meta: 
     abstract = True 

편집가 : 다니엘은 코멘트에 언급 한 바와 같이, 당신이 제안 솔루션이 잘 작동해야했다 가졌

+0

'Place.save' 메소드를 오버라이드하고 거기에서 설명하는 로직을 구현하려 했습니까? – lanzz

+1

제안 된 구문을 사용해 보셨습니까? 이것은 Django에서 다중 테이블 상속이 작동하는 방식이며 원하는 구문이 사용자가 보여준 모델에서 올바르게 작동합니다. 사실 부모님이 Bar에있는 필드가 아니기 때문에 첫 번째 버전 *이 작동하지 않습니다. –

+0

와우, 실제로 작동합니다. django-rest-framework의'name' 필드에 약간의 오류가 발생했으며 잘못된'save' 호출과 관련이 있다고 생각했습니다. 내가 틀렸던 것처럼 보인다. 고마워. – rocknrollnerd

답변

2

장고의이 abstract base classes 모델 사이에 공통 필드를 공유하는 문제를 해결. 여기에 대한 자세한 내용은 Django's multi-table inheritance

+1

그러나 글로벌'unique' 제약 조건은 무엇입니까? 'name'은'bar'와'restaurant' 테이블에 따로 저장되어 있지 않습니까? – rocknrollnerd

0

Daniel Roseman이 언급했듯이, 나는 완전히 잘못되었습니다. 장고는 실제로 제가 설명한대로 작동합니다.