, 당신은 이것에 대한 이유는 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
편집 제 의견, Place
만 Restaurant
또는 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"
그리고 템플릿 : Restaurant
는 Place
에 외래 키 포인팅이 있기 때문에 뾰족한-에 클래스 (Place
)이 그 내용을 찾을 수 있도록
합니다. 그렇지 않으면 모든 단일 "하위 모델"을 반복해야합니다. 또는 나는 무엇인가 놓치고 있냐? – msebai
@msebai : 예, 다른 가능성을 반복해야합니다. 디자인에서'Place'가 오직'Restaurant'이나'Shop'만이 아니라 둘 다가 아니라고 요구한다면'OneToOneField'를 사용해서는 안되며 대신 모델 상속을 사용해야합니다 : http : //docs.djangoproject. co.kr/ko/1.2/topics/db/models/# model-inheritance –
상속은 여기에 많은 의미가 있다고 생각합니다. 난 그냥 장고가 DB 수준에서 이것을 어떻게 처리 할 지 알아 내야 할 필요가있다. 많은 시간을 내 주셔서 감사합니다. – msebai