2011-12-02 41 views
1

在我的項目中,我使用的代碼來自http://djangosnippets.org/snippets/562/,並遇到一些問題。創建自定義可鏈接查詢集管理器的問題

當我使用自己的ChainableQuerySetManager並嘗試通過相關對象創建對象時,我得到遞歸錯誤。

ChainableQuerySetManager來源:

class ChainableQuerySetManager(models.Manager): 
     def __init__(self, qs_class=models.query.QuerySet): 
      super(ChainableQuerySetManager,self).__init__() 
      self.queryset_class = qs_class 

     def get_query_set(self): 
      return self.queryset_class(self.model) 

     def __getattr__(self, attr, *args): 
      try: 
       return getattr(self.__class__, attr, *args) 
      except AttributeError: 
       return getattr(self.get_query_set(), attr, *args) 

擴展查詢集:

class ExtendedQuerySet(models.query.QuerySet): 

     def get_or_None(self, *args, **kwargs): 
      result = None 
      try: 
       result = self.get(*args, **kwargs) 
      except ObjectDoesNotExist: 
       pass 
      return result 

和測試機型:

class ParentObject(models.Model): 
     value = models.IntegerField(default=0) 

     def count_someobjects(self): 
      return self.someobjects.count() 

     def create_someobject_throw_related(self): 
      return self.someobjects.create() 

     def create_someobject(self): 
      return SomeObject.objects.create(parent=self) 

    class SomeObject(models.Model): 
     parent = models.ForeignKey(ParentObject, related_name='someobjects') 
     value = models.IntegerField(default=1) 
     objects = ChainableQuerySetManager(ExtendedQuerySet) 

測試用例的樣子:

class ExtendedQuerySetTests(TestCase): 
     def setUp(self): 
      self.parent = ParentObject.objects.create() 

     def test_create_someobject_in_parent(self): 
      someobject = self.parent.create_someobject_throw_related() 

我將不勝感激您的幫助。 全部來源可以在https://github.com/RANUX/django-simptools

+3

我知道你是一個新用戶......但在發佈你的第一個問題之前,可能需要查看一下:對於你自己可能會注意到的代碼在問題中被粘貼(和格式化)沒有鏈接。將它與回購鏈接聯繫起來也是無用的:當您解決問題時,回購中的代碼將會改變,未來的訪問者將無法從您的問題中受益。我不是downvoter,但我明白爲什麼有人真的低估了你的問題......: - | – mac

+0

謝謝你的幫助。 –

回答

0

我最近有一個類似的問題。嘗試在您的查詢管理器中將self.__class__替換爲ChainableQuerySetManager。我從來沒有完全理清這是爲什麼這個問題,但它確實爲我解決了一些問題。