Django __在外键连接上调用筛选器时调用init

Django __在外键连接上调用筛选器时调用init,django,django-models,Django,Django Models,我真的被这件事弄糊涂了: 我有3个模型,通过外键链接在一起: from django.db import models class A(models.Model): name = models.CharField(max_length=100, unique=True) class B(models.Model): a = models.ForeignKey(A) name = models.CharField(max_length=100, unique=True) clas

我真的被这件事弄糊涂了:

我有3个模型,通过外键链接在一起:

from django.db import models

class A(models.Model):
  name = models.CharField(max_length=100, unique=True)

class B(models.Model):
  a = models.ForeignKey(A)
  name = models.CharField(max_length=100, unique=True)

class C(models.Model):
  b = models.ForeignKey(B)
  name = models.CharField(max_length=100, unique=True)      

  def __init__(self, *args, **kwargs):
    import pdb; pdb.set_trace()
    super(C, self).__init__(*args, **kwargs)
    self.name = 'inited'
当我试图获取指向某个a实例的所有C实例的列表时,会调用C的
\uuuu init\uuu

class SimpleTest(TestCase):
  def test_goes_to_init(self):
    a = A(name = 'a')
    a.save()
    b = B(name = 'b', a = a)
    b.save()
    c = C(name = 'c', b = b)
    c.save()
    cs = C.objects.all().filter(b__a=a)
    arr = [i for i in cs] # Here C's __init__ gets called
    self.assertEqual(arr.__len__(), 1)
为什么会这样?是否有方法生成不调用
\uuuu init\uuuu
的数组?在我的实际应用程序中,
\uuuu init\uuu
函数非常慢,应该很少调用

以下是调试会话的回溯跟踪:

  /home/ranmoshe/sites/django/testttt/testing123/tests.py(13)test_goes_to_init()
-> arr = [i for i in cs]
  /usr/local/lib/python2.6/dist-packages/django/db/models/query.py(106)_result_iter()
-> self._fill_cache()
  /usr/local/lib/python2.6/dist-packages/django/db/models/query.py(760)_fill_cache()
-> self._result_cache.append(self._iter.next())
  /usr/local/lib/python2.6/dist-packages/django/db/models/query.py(282)iterator()
-> obj = self.model(*row[index_start:aggregate_start])
> /home/ranmoshe/sites/django/testttt/testing123/models.py(16)__init__()
-> super(C, self).__init__(*args, **kwargs)

每次创建python实例时,都将调用
\uuuuuu init\uuuu
。在保存数据库记录时,您可能正在尝试执行代码。为此,您应该:


\uuuuu init\uuuuuuuu
…应该很少调用”。应该何时调用?感谢您的回答。在对象安全存储在数据库中后调用了该代码,结果证明这是标准行为-对象被重建(使用init)当从数据库中检索它们时,不知道为什么。为了解决这个问题,我更改了init以获取原始数据库存储实例中的值,而不是执行原始初始化过程,从而解决了问题。
class C(models.Model):
    ...

    def save(self, *args, **kwargs):
        do_something()
        super(C, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()