Tweaked the makefixture command to not recurse on reverse relationships.

- Legacy-Id: 6446
This commit is contained in:
Henrik Levkowetz 2013-10-14 18:36:20 +00:00
parent 6f6f1d65e6
commit bc0e4e5614

View file

@ -47,7 +47,7 @@ from django.db.models.fields.related import ForeignKey
from django.db.models.fields.related import ManyToManyField
from django.db.models.loading import get_models
DEBUG = False
DEBUG = True
def model_name(m):
module = m.__module__.split('.')[:-1] # remove .models
@ -116,34 +116,38 @@ class Command(LabelCommand):
raise CommandError("Wrong slice: %s" % slice)
all = objects
collected = set([(x.__class__, x.pk) for x in all])
related = []
for obj in objects:
# follow reverse relations as requested
for reverse_field in follow_reverse.get(obj.__class__, []):
mgr = getattr(obj, reverse_field)
for new in mgr.all():
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
objects += related
all.extend(related)
if propagate:
collected = set([(x.__class__, x.pk) for x in all])
while objects:
related = []
for x in objects:
for obj in objects:
if DEBUG:
print "Adding %s[%s]" % (model_name(x), x.pk)
print "Adding %s[%s]" % (model_name(obj), obj.pk)
# follow forward relation fields
for f in x.__class__._meta.fields + x.__class__._meta.many_to_many:
for f in obj.__class__._meta.fields + obj.__class__._meta.many_to_many:
if isinstance(f, ForeignKey):
new = getattr(x, f.name) # instantiate object
new = getattr(obj, 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():
for new in getattr(obj, f.name).all():
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
# follow reverse relations as requested
for reverse_field in follow_reverse.get(x.__class__, []):
mgr = getattr(x, reverse_field)
for new in mgr.all():
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
objects = related
all.extend(objects)
all.extend(related)
try:
return serializers.serialize(format, all, indent=indent)