ฉันชอบคำตอบของ jocteeเพราะมันง่ายมาก
if hasattr(request.user, 'type1profile'):
elif hasattr(request.user, 'type2profile'):
else:
ผู้แสดงความคิดเห็นรายอื่นได้แจ้งข้อกังวลว่าอาจใช้ไม่ได้กับ Python หรือ Django บางเวอร์ชัน แต่เอกสารของ Djangoแสดงเทคนิคนี้เป็นหนึ่งในตัวเลือก:
คุณยังสามารถใช้ hasattr เพื่อหลีกเลี่ยงความจำเป็นในการจับข้อยกเว้น:
>>> hasattr(p2, 'restaurant')
False
แน่นอนเอกสารยังแสดงเทคนิคการจับข้อยกเว้น:
p2 ไม่มีร้านอาหารที่เกี่ยวข้อง:
>>> from django.core.exceptions import ObjectDoesNotExist
>>> try:
>>> p2.restaurant
>>> except ObjectDoesNotExist:
>>> print("There is no restaurant here.")
There is no restaurant here.
ฉันเห็นด้วยกับโจชัวว่าการจับข้อยกเว้นทำให้ชัดเจนขึ้นว่าเกิดอะไรขึ้น แต่ดูเหมือนจะยุ่งกว่าสำหรับฉัน บางทีนี่อาจเป็นการประนีประนอมที่สมเหตุสมผล?
>>> print(Restaurant.objects.filter(place=p2).first())
None
นี่เป็นเพียงการสืบค้นRestaurant
วัตถุตามสถานที่ มันกลับมาNone
หากสถานที่นั้นไม่มีร้านอาหาร
นี่คือตัวอย่างข้อมูลปฏิบัติการเพื่อให้คุณเล่นกับตัวเลือกต่างๆ หากคุณติดตั้ง Python, Django และ SQLite3 ไว้ก็ควรรัน ฉันทดสอบด้วย Python 2.7, Python 3.4, Django 1.9.2 และ SQLite3 3.8.2
import sys
import django
from django.apps import apps
from django.apps.config import AppConfig
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
from django.db import connections, models, DEFAULT_DB_ALIAS
from django.db.models.base import ModelBase
NAME = 'udjango'
def main():
setup()
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(Place, primary_key=True)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant)
name = models.CharField(max_length=50)
def __str__(self):
return "%s the waiter at %s" % (self.name, self.restaurant)
syncdb(Place)
syncdb(Restaurant)
syncdb(Waiter)
p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
p1.save()
p2 = Place(name='Ace Hardware', address='1013 N. Ashland')
p2.save()
r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)
r.save()
print(r.place)
print(p1.restaurant)
try:
print(p2.restaurant)
except ObjectDoesNotExist:
print("There is no restaurant here.")
print(getattr(p2, 'restaurant', 'There is no restaurant attribute.'))
if hasattr(p2, 'restaurant'):
print('Restaurant found by hasattr().')
else:
print('Restaurant not found by hasattr().')
print(Restaurant.objects.filter(place=p2).first())
def setup():
DB_FILE = NAME + '.db'
with open(DB_FILE, 'w'):
pass
settings.configure(
DEBUG=True,
DATABASES={
DEFAULT_DB_ALIAS: {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': DB_FILE}},
LOGGING={'version': 1,
'disable_existing_loggers': False,
'formatters': {
'debug': {
'format': '%(asctime)s[%(levelname)s]'
'%(name)s.%(funcName)s(): %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'}},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'debug'}},
'root': {
'handlers': ['console'],
'level': 'WARN'},
'loggers': {
"django.db": {"level": "WARN"}}})
app_config = AppConfig(NAME, sys.modules['__main__'])
apps.populate([app_config])
django.setup()
original_new_func = ModelBase.__new__
@staticmethod
def patched_new(cls, name, bases, attrs):
if 'Meta' not in attrs:
class Meta:
app_label = NAME
attrs['Meta'] = Meta
return original_new_func(cls, name, bases, attrs)
ModelBase.__new__ = patched_new
def syncdb(model):
""" Standard syncdb expects models to be in reliable locations.
Based on https://github.com/django/django/blob/1.9.3
/django/core/management/commands/migrate.py#L285
"""
connection = connections[DEFAULT_DB_ALIAS]
with connection.schema_editor() as editor:
editor.create_model(model)
main()
select_related()
ตอนนี้หรือในอนาคต - หรืออาจจะเพื่อให้แน่ใจว่าคุณได้จัดการกับเวทมนตร์ประเภทอื่น ๆ ที่อาจเกิดขึ้นที่อื่น - คุณต้องขยายการทดสอบดังนี้:if hasattr(object, 'onetoonerevrelattr') and object.onetoonerevrelattr != None