在独立脚本网站中使用Django模型不更新

2024-06-14 17:56:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用DjangoORMupdate()函数更新SQLite3DB中的记录。你知道吗

我可以看到,在我的独立脚本中运行update()函数之后,数据库实际上已经更新了,但是在我重新启动gunicorn之前,这些更改不会反映在我的网站上:

sudo systemctl restart gunicorn

我怀疑这个问题与我将模型导入独立脚本的方式有关。你知道吗

ROOT_DIR = /path/to/root/dir

sys.path.insert(0, ROOT_DIR)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AppName .settings')

import django
django.setup()

from main.models import Bet, Investment, Profile
from django.contrib.auth.models import User

Bet.objects.filter(id=4).update(revenue=10)

这段代码每天在我的服务器上运行一次。 我希望看到更新反映在我的网站上,而不必重新启动gunicorn。你知道吗

更多上下文:我正在同一个独立脚本中运行create()函数,该脚本更新数据库并按预期反映在我的站点上,而无需重新启动gunicorn。你知道吗


Tags: pathdjango函数fromimport脚本数据库网站
1条回答
网友
1楼 · 发布于 2024-06-14 17:56:42

也许这不是您问题的直接答案,但是对于Django中的独立脚本,我建议使用custom management commands。这样可以避免设置和环境变量。你知道吗

例如,您可以编写一个脚本main/management/commands/my_script_1.py(阅读文档,了解它为什么会出现在那里):

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from main.models import Bet, Investment, Profile

class Command(BaseCommand):
    def handle(self, *args, **options):
        self.stdout.write('Before: {}'.format(
            [(e.pk, e.revenue) for e in Bet.objects.filter(id=4)]))

        # do the update of rows
        Bet.objects.filter(id=4).update(revenue=10)

        self.stdout.write('After: {}'.format(
            [(e.pk, e.revenue) for e in Bet.objects.filter(id=4)]))

然后可以像这样调用脚本(在linux中):

$ ./manage.py my_script_1

或者,如果您的代码位于虚拟环境中,但希望将脚本调用为cron作业:

$ crontab -l
0 5 * * * cd /path/to/project && /path/to/project/.venv/bin/python /path/to/project/manage.py my_script_1 > /dev/null 2>&1

相关问题 更多 >