Джанго, родовые отношения, делают светильники - PullRequest
7 голосов
/ 25 сентября 2010

Я пытаюсь добавить поддержку общих связей и отношений один-к-одному для команды makefixture django-test-utils, вот источник http://github.com/ericholscher/django-test-utils/blob/master/test_utils/management/commands/makefixture.py

У кого-нибудь есть идеи, как это сделать?Или может быть есть другой инструмент для такой вещи, как:

./manage.py dumpcmd User[:10] > fixtures.json

1 Ответ

1 голос
/ 15 июля 2011

У вас есть несколько вариантов решения проблемы.Я сконцентрируюсь на подходе 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
...