Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django, generic relations, make fixtures

I'm trying to add generic relations and one-to-one relations support for django-test-utils makefixture command, here is the source http://github.com/ericholscher/django-test-utils/blob/master/test_utils/management/commands/makefixture.py

Does somebody have ideas how to do this? Or may be there is another tool for such thing as:

./manage.py dumpcmd User[:10] > fixtures.json
like image 728
Roman Dolgiy Avatar asked Sep 25 '10 15:09

Roman Dolgiy


1 Answers

You have several options how to approach the problem. I'll concentrate on the poke-the-code aproach, since it's been a while since I mucked around with django internals.

I have included the relevant code below from the link. Note that I have removed irrelevant parts. Also note that the part you'll be editing YOUR CASE HERE is in need of a refactor.

Follow the following algorithm until you're satisfied.

  1. Refactor the if statements depending on the fields into (one or more) separate function(s).
  2. Add inspection code until you figure out what fields correspond to generic relations.
  3. Add extraction code until the generic relations are followed.
  4. 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
    
like image 144
phoku Avatar answered Sep 27 '22 20:09

phoku