web-dev-qa-db-ja.com

Django:「DoesNotExist」はどこから来たのですか?

Django DoesNotExistdb.models.fields.related.pyのように発生します。Django.core.exceptionsで定義されているObjectDoesNotExistではなく、常にDoesNotExistだけです。この例外クラスはどこで定義されていますか、または例外を完全に理解していませんか?例外ではないことを確認しました(少なくとも私が知っていることではありません)。明らかに混乱しています。

注: `self.someforeignkey.DoesNotExistのように、モデルサブクラスインスタンスの属性として無料で提供されます。これはどのように可能ですか?

39
orokusaki

DoesNotExistは文書化されています ここ

DoesNotExist例外はDjango.core.exceptions.ObjectDoesNotExistを継承するため、複数のDoesNotExist例外をターゲットにすることができます。

したがって、except ObjectDoesNotExist:を完全に使用して、DoesNotExist句で発生する可能性のあるモデル固有のtry例外をすべてキャッチするか、必要に応じてexcept SomeSpecificModel.DoesNotExist:を使用できます。具体的に。

この属性がモデルクラスに追加されるDjangoのソースコード内の特定の場所を探している場合は、 ここ 、34〜37行目を参照してください。

# Create the class.
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))
new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))
56
Alex Martelli

DoesNotExistは、MultipleObjectsReturnedと同様に、モデルクラスの属性です。モデルの生成時にモデルに追加されます。

編集:このプロセスを担当するメタクラスはModelBaseDjango.db.models.base)そしてあなたはそれを見て何が起こっているのか見るかもしれません。

7
shanyu