Python django DoesNotExist匹配查询仅与postgres一起不存在

Python django DoesNotExist匹配查询仅与postgres一起不存在,python,django,postgresql,exception,celery,Python,Django,Postgresql,Exception,Celery,我正在使用的assetsdjango应用程序在SQLite中运行良好,但我面临着删除/更新大型记录集的性能问题,因此我正在向PostgreSQL数据库过渡 为此,我首先更新app/settings.py以配置PostgreSQL,然后从一个新的数据库开始,删除assets/migrations/目录。我现在正在跑步: ./manage.py makemigrations assets ./manage.py migrate --run-syncdb ./manage.py createsuper

我正在使用的
assets
django应用程序在SQLite中运行良好,但我面临着删除/更新大型记录集的性能问题,因此我正在向PostgreSQL数据库过渡

为此,我首先更新
app/settings.py
以配置PostgreSQL,然后从一个新的数据库开始,删除
assets/migrations/
目录。我现在正在跑步:

./manage.py makemigrations assets
./manage.py migrate --run-syncdb
./manage.py createsuperuser
我在注册的
post\u create
信号中调用了一个函数。它在创建
扫描
对象时运行扫描。在类
assets.models.Scan中:

@classmethod
def post_create(cls, sender, instance, created, *args, **kwargs):
    if not created:
        return

    from celery.result import AsyncResult
    # get the domains for the project, from scan
    print("debug: task = tasks.populate_endpoints.delay({})".format(instance.pk))
    task = tasks.populate_endpoints.delay(instance.pk)
违规代码:

from celery import shared_task
....
import datetime

@shared_task
def populate_endpoints(scan_pk):
    from .models import Scan, Project, 
    from anotherapp.plugins.sensual import subdomains

    scan = Scan.objects.get(pk=scan_pk) #<<<<<<<< django no like
    new_entries_count = 0
    project = Project.objects.get(id=scan.project.id)
    ....
但是,通过
/manage.py shell进行交互
表明存在pk==2的
扫描
对象:

>>> from assets.models import Scan
>>> Scan.objects.all()
<QuerySet [<Scan: ACME Web Test Scan>]>
>>> s = Scan.objects.all().first()
>>> s.pk
2
>>来自assets.models导入扫描
>>>Scan.objects.all()
>>>s=Scan.objects.all().first()
>>>s.pk
2.
我唯一的猜测是,在调用
post\u create
函数时,PostgreSQL数据库中仍然不存在
Scan
对象,尽管调用了
save()

SQLite不存在此问题。
此外,我还没有发现与stackoverflow相关的问题,因为
DoesNotExist
异常看起来相当普遍,并且是由许多因素引起的。 如果您对此有任何想法,我们将不胜感激。

这是事务和隔离级别的结果-有时在执行任务时事务尚未提交,如果您的隔离级别已提交,则您确实无法从其他进程读取此记录。作为解决办法

注意:从技术上讲,这个问题是django的重复,但公认的答案使用了
django事务挂钩
,此后该挂钩被合并到django中

这是由事务和隔离级别导致的-有时在执行任务时事务尚未提交,如果隔离级别为READ Committed,则您确实无法从其他进程读取此记录。作为解决办法


注意:从技术上讲,这个问题是django的重复,但公认的答案使用了
django事务挂钩
,此后该挂钩被合并到django中

两个PK的类型是否相同?您尚未提供模型规范。如果未明确声明,则应为ints。但不确定从一个数据库迁移到另一个数据库时是否会出现问题。两个PK的类型是否相同?您尚未提供模型规范。如果未明确声明,则应为ints。但不确定从一个db迁移到另一个db时是否会出现问题。感谢Bruno,我成功地在第一个链接中改编了
TransactionAwareTask
类片段。感谢Bruno,我成功地在第一个链接中改编了
TransactionAwareTask
类片段。
>>> from assets.models import Scan
>>> Scan.objects.all()
<QuerySet [<Scan: ACME Web Test Scan>]>
>>> s = Scan.objects.all().first()
>>> s.pk
2