2

インスタンスを検査し、そのすべてのリレーションを検索するルーチンを作成しています (例: を使用instance._meta.get_all_related_objects()) が、OneToOneField を含むリレーションを取得する方法が見つかりません。

たとえば、次の 2 つのモデルの場合:

class Main(models.Model):
    ...

class Extension(models.Model):
    ...
    main = models.OneToOneField(Main, primary_key=True)

「メイン」インスタンスが与えられた場合、関連する OneToOne オブジェクト/クラスを見つける必要があります (明らかに、それらの名前を知らなくても)。

どうやってやるの?

4

1 に答える 1

2
from django.db import models

def all_models_with_oto(the_model):
    """
    Returns all models that have a one-to-one pointing to `model`.
    """
    model_list = []
    for model in models.get_models():
        for field in model._meta.fields:
            if isinstance(field, models.OneToOneField):
                if field.rel.to == the_model:
                    model_list.append(model)
    return model_list

リスト内包バージョン (皮肉なことに遅く、おそらくanyリストがネストされているため):

def all_models_with_oto(the_model):
    """
    Returns all models that have a one-to-one pointing to `model`.
    """
    return [model for model in models.get_models() if any([isinstance(field, models.OneToOneField) and field.rel.to == the_model for field in model._meta.fields])]
于 2011-03-25T04:57:14.033 に答える