Мені подобається відповідь учасника , тому що це так просто.
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