Saya suka jawaban joctee , karena sangat sederhana.
if hasattr(request.user, 'type1profile'):
elif hasattr(request.user, 'type2profile'):
else:
Pemberi komentar lain telah mengemukakan kekhawatiran bahwa ini mungkin tidak bekerja dengan versi Python atau Django tertentu, tetapi dokumentasi Django memperlihatkan teknik ini sebagai salah satu opsi:
Anda juga dapat menggunakan hasattr untuk menghindari perlunya penangkapan pengecualian:
>>> hasattr(p2, 'restaurant')
False
Tentu saja, dokumentasi juga menunjukkan teknik penangkapan pengecualian:
p2 tidak memiliki restoran terkait:
>>> from django.core.exceptions import ObjectDoesNotExist
>>> try:
>>> p2.restaurant
>>> except ObjectDoesNotExist:
>>> print("There is no restaurant here.")
There is no restaurant here.
Saya setuju dengan Joshua bahwa menangkap pengecualian membuatnya lebih jelas apa yang terjadi, tetapi tampaknya lebih berantakan bagi saya. Mungkinkah ini kompromi yang masuk akal?
>>> print(Restaurant.objects.filter(place=p2).first())
None
Ini hanya menanyakan Restaurant
objek berdasarkan tempat. Ia kembaliNone
jika tempat itu tidak memiliki restoran.
Berikut cuplikan yang dapat dieksekusi untuk Anda mainkan dengan opsi. Jika Anda memiliki Python, Django, dan SQLite3 terinstal, itu harus dijalankan. Saya mengujinya dengan Python 2.7, Python 3.4, Django 1.9.2, dan 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()
sekarang atau di masa depan - atau mungkin bahkan untuk memastikan Anda juga menangani sihir jenis lain yang mungkin terjadi di tempat lain - Anda harus memperpanjang tes sebagai berikut:if hasattr(object, 'onetoonerevrelattr') and object.onetoonerevrelattr != None