У вас есть несколько вариантов решения проблемы.Я сконцентрируюсь на подходе poke-the-code , так как прошло много времени с тех пор, как я обшаривал внутренности django.
Я включил соответствующий код ниже по ссылкеОбратите внимание, что я удалил ненужные части.Также обратите внимание, что часть, которую вы будете редактировать ВАШ СЛУЧАЙ ЗДЕСЬ нуждается в рефакторинге.
Следуйте следующему алгоритму, пока не будете удовлетворены.* Измените операторы if
в зависимости от полей на (одну или несколько) отдельных функций.
Добавляйте проверочный код, пока не выясните, какие поля соответствуют родовым отношениям. Добавитькод извлечения, пока не будут соблюдены родовые отношения.
Test.
def handle_models(self, models, **options):
# SNIP handle options
all = objects
if propagate:
collected = set([(x.__class__, x.pk) for x in all])
while objects:
related = []
for x in objects:
if DEBUG:
print "Adding %s[%s]" % (model_name(x), x.pk)
# follow forward relation fields
for f in x.__class__._meta.fields + x.__class__._meta.many_to_many:
# YOU CASE HERE
if isinstance(f, ForeignKey):
new = getattr(x, f.name) # instantiate object
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
if isinstance(f, ManyToManyField):
for new in getattr(x, f.name).all():
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
# SNIP
objects = related
all.extend(objects)
# SNIP serialization