2010-09-25 124 views
7

我想補充的通用關係和Django的測試-utils的makefixture命令一到一個關係的支持,這是源http://github.com/ericholscher/django-test-utils/blob/master/test_utils/management/commands/makefixture.pyDjango的,通用的關係,使燈具

是否有人有想法如何做這個?或者可能有另一種工具,如:

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

請編輯問題,包括相關的源。我不打算通過點擊訪問其他網站來查看你在說什麼,對於有同樣問題的人來說,以這種方式發現這個問題更加困難。 – 2011-05-22 08:23:13

+0

你應該添加一些關於你的問題的細節,你到底有什麼問題? – 2011-07-08 19:18:06

回答

1

您有幾個選擇如何解決這個問題。我將專注於捅代碼的問題,因爲我已經用django內部的東西去了一段時間。

我在下面的鏈接中包含了相關代碼。請注意,我刪除了不相關的部分。另請注意,您將要編輯的部分是您的案例需要重構。

請遵循以下算法,直到您滿意爲止。

  1. 重構if聲明取決於(一個或多個)單獨函數的字段。
  2. 添加檢查代碼,直到找出哪些字段對應於一般關係。
  3. 添加提取代碼,直到遵循泛型關係。
  4. 測試。

    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