Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django'中的缓存;曼尼托曼尼菲尔德酒店_Python_Django_Many To Many_Manytomanyfield_Django Orm - Fatal编程技术网

Python Django'中的缓存;曼尼托曼尼菲尔德酒店

Python Django'中的缓存;曼尼托曼尼菲尔德酒店,python,django,many-to-many,manytomanyfield,django-orm,Python,Django,Many To Many,Manytomanyfield,Django Orm,我在Django中遇到一些缓存问题。到目前为止,我只在运行testsuite时看到过这个问题。问题是,有时候(似乎总是在第二次调用代码时发生这种情况),Django不更新缓存,或者变得不一致 经过一些调试后提取的代码是: class Source(models.Model): name = models.CharField(max_length = 50) quality = models.IntegerField(default = 0) class Reference(mo

我在Django中遇到一些缓存问题。到目前为止,我只在运行testsuite时看到过这个问题。问题是,有时候(似乎总是在第二次调用代码时发生这种情况),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>]
这种行为当然会进一步破坏代码。你知道这里可能出了什么问题,或者至少知道如何调试它吗


PS:看起来是
Reference
类上的排序导致了这种情况。但我仍然不清楚原因。

我无法用sqlite3复制。是否传递的
引用的实例未保存?以下内容运行时没有打嗝:

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)

最后我找到了导致这个问题的原因。这是我自己的缓存代码,而不是Django的

我有定制的源代码管理器,它返回并缓存了一些标准源代码:

class SourceManager(models.Manager):
    url_source = None
    def get_generic(self):
        if self.url_source is None:
            self.url_source, created = self.get_or_create(name = 'URL', quality = 0)
        return self.url_source

class Source(models.Model):
    name = models.CharField(max_length = 50)
    quality = models.IntegerField(default = 0)

    objects = SourceManager()
这在应用程序中工作得非常好——一旦创建了源,管理者就会记住它的存在,因为源在其生命周期内不会改变。然而,在测试中,它们会消失,因为整个测试在单个事务中运行,然后恢复


我觉得奇怪的是,
models.ForeignKey
没有抱怨获取不存在的对象,但是错误出现在以后,按
source\u质量进行排序时,因为底层连接选择找不到匹配的
source
对象。

您可以指定
auto\u create()的参数吗
?它是一个
引用
实例(新创建的)。如果引用不保存,
发出.references.add(…)
将失败。事实上,提取的代码并没有暴露问题,我只是不能在这里发布整个项目,因为它太大了。我只是在寻找代码中可能出错的指针。有了真正的应用程序,我能够在SQLite和PostgreSQL后端重现这些问题。
class SourceManager(models.Manager):
    url_source = None
    def get_generic(self):
        if self.url_source is None:
            self.url_source, created = self.get_or_create(name = 'URL', quality = 0)
        return self.url_source

class Source(models.Model):
    name = models.CharField(max_length = 50)
    quality = models.IntegerField(default = 0)

    objects = SourceManager()