开发者

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.co开发者_如何学Cm/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


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
    
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜