2010-07-21 6 views
2

다양한 모델에서 단일 부모까지 다른 OneToOne 관계가있는 다중 모델이 있습니다. 이 예를 고려 : 장소의 목적은 장고보기에, 다른 모델의에 관계가있는 경우 위의 모델은 실제 시나리오에서 의미가있는 경우에 관계없이Django 다중 모델 : 추적 관계

class Place(models.Model): 
    name = models.CharField(max_length=100) 
    address = models.CharField(max_length=100) 
    ... 

class Restaurant(models.Model): 
    place = models.OneToOneField(Place) 
    ... 

class Shop(models.Model): 
    place = models.OneToOneField(Place) 
    ... 

을, 어떻게 사람을 식별 할 수 있습니까?

템플릿에서

답변

1

, 당신은 이것에 대한 이유는 OneToOneField 항목이 실제로 참조하고 모델의 속성을 만들 수 있다는 것입니다

{% if place.restaurant %} 
    <!-- stuff goes here --> 
{% endif %} 

을 말할 수있다. 일반적인 파이썬 코드에서 레스토랑이 정의되지 않은 place.restaurant이라고 말하면 예외가 발생하지만 템플릿은 예외를 삼킨다.

하는 파이썬 코드에서 이런 일을해야하는 경우, 간단한 이해 방법은 try/except 블록을 래핑하는 것입니다 : 나는에서 말하는 것처럼 :

place = Place.objects.all()[0] 
try: 
    restaurant = place.restaurant 
    # do something with restaurant 
except ObjectDoesNotExist: 
    # do something without restaurant 

편집 제 의견, PlaceRestaurant 또는 Shop 중 하나이지만 둘 다 사용하지 않으려면 OneToOneField을 사용해서는 안되며 대신 model inheritance을 사용해야합니다. 이 같은

Place 두 개 이상의 다른 가능성을 가질 수 있다고 가정하면, 내가 일을하는 것이 좋습니다 뭔가 :

class Place(Model): 
    # define your fields here 

    # you could generate this automatically with trickery 
    OTHER_MODELS = ["restaurant", "shop"] 

    @property 
    def relationships(self): 
     if not hasattr(self, "_relationships"): 
      self._relationships = {} 
      for attr in OTHER_MODELS: 
       try: 
        self._relationshops[attr] = getattr(self, attr) 
       except ObjectDoesNotExist: 
        pass 
     return self._relationships 

위는 place.relationships 말을하자

{"restaurant": <Restaurant Object>, "shop": <Shop Object>} 
처럼 보였다 사전을 다시 얻을 것

이 있지만 그 중 하나 또는 둘 다 존재하지 않을 수도 있습니다. OneToOneField 관계를 되돌릴 때마다 잠재적 인 예외를 잡아야하는 것보다 작업하기가 더 쉽습니다.

# python 
import yourproject.settings 
from django.db.models.base import ObjectDoesNotExist 
try: 
    r = place.restaurant_set.get() 
    do_something(r.restaurant_field) 
except ObjectDoesNotExist: 
    print "place has no restaurant" 

그리고 템플릿 : RestaurantPlace에 외래 키 포인팅이 있기 때문에 뾰족한-에 클래스 (Place)이 그 내용을 찾을 수 있도록

+0

합니다. 그렇지 않으면 모든 단일 "하위 모델"을 반복해야합니다. 또는 나는 무엇인가 놓치고 있냐? – msebai

+0

@msebai : 예, 다른 가능성을 반복해야합니다. 디자인에서'Place'가 오직'Restaurant'이나'Shop'만이 아니라 둘 다가 아니라고 요구한다면'OneToOneField'를 사용해서는 안되며 대신 모델 상속을 사용해야합니다 : http : //docs.djangoproject. co.kr/ko/1.2/topics/db/models/# model-inheritance –

+1

상속은 여기에 많은 의미가 있다고 생각합니다. 난 그냥 장고가 DB 수준에서 이것을 어떻게 처리 할 지 알아 내야 할 필요가있다. 많은 시간을 내 주셔서 감사합니다. – msebai

0

, 그것은 클래스에 related name 필드 잎 당신은 어떻게 든 상황에서 placeobject에 액세스 할 수있는 가정 : 하나의 장소 객체 즉, 상점과 레스토랑에 대한 여러 가능성이 아니었다면 갈 수있는 방법입니다

{% with placeobject.restaurant_set.get as r %} 
    {% if r %} 
    {{ r.restaurant_field }} 
    {% else %} 
    No restaurant 
    {% endif %} 
{% endwith %}