Django: найти все поля OneToOneFields, указывающие на модель - PullRequest
2 голосов
/ 16 марта 2011

Я пишу подпрограммы для проверки экземпляра и поиска всех его отношений (например, с использованием instance._meta.get_all_related_objects()), но я не могу найти способ получить отношения, включающие OneToOneField.

Например, с этимидве модели:

class Main(models.Model):
    ...

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

с заданным экземпляром 'Main', я должен найти связанные с ним объекты / классы OneToOne (очевидно, без указания их имен).

Как я могу это сделать?

1 Ответ

2 голосов
/ 25 марта 2011
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])]
...