我在 Django 中遇到一些缓存问题。到目前为止,我只在运行测试套件时看到过这个问题。问题是有时(似乎这种情况总是在第二次调用代码时发生),Django 不更新它的缓存或者它变得不一致。
经过一些调试后提取的代码是:
class Source(models.Model):
name = models.CharField(max_length = 50)
quality = models.IntegerField(default = 0)
class Reference(models.Model):
url = models.URLField()
source = models.ForeignKey(Source)
class Meta:
ordering = ['-source__quality']
class Issue(models.Model):
references = models.ManyToManyField(Reference)
master = models.ForeignKey(Reference, related_name = 'mastered_issue_set')
def auto_create(instance):
issue = Issue.objects.create(master = instance)
print issue.references.count(), issue.references.all()
issue.references.add(instance)
print issue.references.count(), issue.references.all()
第一次调用时我正确地得到了以下输出:
0 []
1 [<Reference: test>]
但是在第二次调用 auto_create
时,Django 认为有一个引用,但它没有给我:
0 []
1 []
这种行为当然会破坏更多的代码。知道这里可能出什么问题或至少如何调试它吗?
PS:这看起来像是对 Reference
类的排序导致的。但我仍然不清楚为什么。
最佳答案
我无法用 sqlite3 重现。难道是传入的Reference
实例没有保存?以下运行没有打嗝:
def auto_create(instance):
issue = Issue.objects.create(master = instance)
print issue.references.count(), issue.references.all()
assert issue.references.count()==0, "initial ref count is not null"
assert len(issue.references.all())==0, "initial ref array is not empty"
issue.references.add(instance)
print issue.references.count(), issue.references.all()
assert issue.references.count()==1, "ref count is not incremented"
assert len(issue.references.all())==1, "initial ref array is not populated"
def test_auto():
s = Source()
s.save()
r = Reference(source=s)
r.save()
auto_create(r)
关于python - 在 Django 的 ManyToManyField 中缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763455/