标签: django-management-command

Django管理命令中添加了虚假新行

在Python 3.5.0上运行Django v1.10:

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        print('hello ', end='', file=self.stdout)
        print('world', file=self.stdout)
Run Code Online (Sandbox Code Playgroud)

预期产量:

hello world
Run Code Online (Sandbox Code Playgroud)

实际产量:

hello 

world
Run Code Online (Sandbox Code Playgroud)

如何正确传递结束字符?我目前使用明确设置的解决方法:

 self.stdout.ending = ''
Run Code Online (Sandbox Code Playgroud)

但是这个hack意味着你没有获得打印功能的所有功能,你必须self.stdout.write手动使用和准备字节.

python django stdout python-3.x django-management-command

15
推荐指数
3
解决办法
947
查看次数

将确认步骤添加到自定义Django management/manage.py命令

我按照本教程创建了以下自定义管理命令.

from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User

from topspots.models import Notification


class Command(BaseCommand):
    help = 'Sends message to all users'

    def add_arguments(self, parser):
        parser.add_argument('message', nargs='?')

    def handle(self, *args, **options):
        message = options['message']
        users = User.objects.all()
        for user in users:
            Notification.objects.create(message=message, recipient=user)

        self.stdout.write(
            self.style.SUCCESS(
                'Message:\n\n%s\n\nsent to %d users' % (message, len(users))
            )
        )
Run Code Online (Sandbox Code Playgroud)

它完全按照我的意愿工作,但我想添加一个确认步骤,以便在for user in users:循环之前询问您是否确实要将消息X发送给N个用户,如果选择"否",则命令将中止.

我认为这可以很容易地完成,因为它发生在一些内置的管理命令中,但它似乎没有涵盖在教程中,甚至在一些搜索和查看内置管理命令的源之后,我无法独自解决这个问题.

python django django-manage.py django-management-command

7
推荐指数
1
解决办法
1840
查看次数

测试Django自定义管理命令

我正在努力解决与django自定义管理命令相关的问题。这是用于从json文件加载数据的自定义管理命令代码:

import time
import json
import sys
from cycu.models import hfModel
from django.db import IntegrityError
from django.core.management import BaseCommand
from django.utils.text import slugify
from django.contrib.gis.geos import Point


class Command(BaseCommand):
    stdin = sys.stdin

    def handle(self, *args, **options):
        start_time = time.time()
        self.stdout.write("Loading Facilities...")
        data = json.load(self.stdin)

        if data:
            hfModel.objects.all().delete()
        instances = []

        for d in data["features"]:
            try:
                if d["properties"]["statename"] == 'Kano':
                    a = hfModel(
                        id=int(d["properties"]["id"]),
                        wardname=d["properties"]["wardname"],
                        wardcode=d["properties"]["wardcode"],
                        lganame=d["properties"]["lganame"],
                        lgacode=int(d["properties"]["lgacode"]),
                        zonename=d["properties"]["zone"],
                        statename=d["properties"]["statename"],
                        source=d["properties"]["source"],
                        ownership=d["properties"]["ownership"],
                        category=d["properties"]["category"],
                        primary_name=d["properties"]["primary_name"],
                        hthfa_code=d["properties"]["hthfa_code"],
                        hthfa_code_slug=slugify(d["properties"]["hthfa_code"]),
                        masterlist_type=d["properties"]["masterlist_type"],
                        point=Point(d["geometry"]["coordinates"])
                    )
                    instances.append(a)
            except …
Run Code Online (Sandbox Code Playgroud)

django django-admin django-management-command

6
推荐指数
1
解决办法
1872
查看次数

如何从 python manage.py test 调用 pytest-django?

我已经制作了名为 pytest_wrp 的自定义管理命令

所以当我打电话时

python manage.py test
Run Code Online (Sandbox Code Playgroud)

这段代码称为:

class Command(test.Command):

    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options) # this calls the python manage.py test
        self.stdout.write("My code starts from here.")
        management.call_command(pytest_wrp.Command(), '--pact-files="{argument}"'.format(argument=path_to_file), '--pact-provider-name="MyService"', verbosity=0)

Run Code Online (Sandbox Code Playgroud)

基本上pytest_wrp有这样的代码:

class Command(BaseCommand):
    help = "Runs tests with Pytest"

    def add_arguments(self, parser):
        parser.add_argument("args", nargs=argparse.REMAINDER)

    def handle(self, *args, **options):
        pytest.main(list(args)) # This doesn't accept the pact args, even if you specify a "--" separator

Run Code Online (Sandbox Code Playgroud)

但这pytest并不pytest-django 意味着我传递的额外参数不会被识别,并且 pytest 无法启动测试套件。

我想传递一些测试用例的额外参数。如果有某种方法可以直接调用 pytest-django 并在代码中传递额外的参数,那将是最佳的。

django django-admin pytest pytest-django django-management-command

6
推荐指数
1
解决办法
2226
查看次数

django-admin makemessages --no-obsolete似乎不起作用

首先,我期待--no-obsolete会注释掉msgid,msgstr如果gettext被删除,对吧?

我的测试方法是:

  1. 我gettext("some string here")在视野中 写道
  2. 我跑了makemessages命令
  3. 它.po按预期编写了一个文件
  4. 然后我gettext()从视图中删除了行并保存了文件,验证了runserver工作.
  5. 我跑了makemessages --no-obsolete,它没有对.po文件进行任何更改.

.po 文件内容提取.

#. Translators: This message is a test of wrap line
#: servers/views.py:31
msgid "Do let me know if it works."
msgstr ""
Run Code Online (Sandbox Code Playgroud)

开发环境

Django = 1.11
OS = Mac/Ubuntu 14.04

settings.py

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = …
Run Code Online (Sandbox Code Playgroud)

django django-admin django-management-command makemessages

5
推荐指数
1
解决办法
672
查看次数

如何在 Django 中使用 call_command() 在特定数据库上运行迁移?

$ python manage.py migrate app_name --database db_name我只是想知道在运行时调用该函数的正确语法是什么management.call_command()。

到目前为止,我有以下内容:

from django.core import management
from django.core.management.commands import migrate

# Migrate the core.contrib.dynamics if needed to the pre-specified database:
management.call_command(migrate.Command(), 'dynamics', '--database {}'.format(DB_NAME))
Run Code Online (Sandbox Code Playgroud)

但是,在调用上述内容时,我在运行时收到以下错误:

Cannot find a migration matching '--database default_node' from app 'dynamics'.
Run Code Online (Sandbox Code Playgroud)

我 99% 确定我可能--错误地调用了参数?谁能指出我正确的方向吗?

动态应用程序的迁移如下:

# Generated by Django 3.0.8 on 2020-07-02 14:28

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='ModelSchema',
            fields=[ …
Run Code Online (Sandbox Code Playgroud)

python django django-migrations django-management-command django-3.0

5
推荐指数
1
解决办法
2922
查看次数

带有自定义管理命令值的多个参数

如何将多个参数与命令行中的值一起传递给自定义django管理命令?

def add_arguments(self, parser):
    parser.add_argument('str_arg1', nargs='+')
    parser.add_argument('int_arg2', nargs='+', type=int)
Run Code Online (Sandbox Code Playgroud)

当我跑:

./manage.py my_command str_arg1 value int_arg2 1 --settings=config.settings.local
Run Code Online (Sandbox Code Playgroud)

我得到以下值options:

options['str_arg1'] = ['str_arg1', 'value', 'int_arg2']
options['int_arg2'] = [1]
Run Code Online (Sandbox Code Playgroud)

尝试在文档和在线搜索解决方案和多种方式传递参数没有运气.Django版本是1.10.

谢谢

python django django-management-command

2
推荐指数
1
解决办法
2500
查看次数

django管理命令中default=False的目的是什么

我正在尝试在 Django 中编写管理命令。根据文档默认设置为 False。我会假设默认值是正在传递的参数的默认值。 使 django 自定义管理命令参数“不需要”

这么说有什么好处 deafult=False

class Command(BaseCommand):
    help = "helps in doing stuff"

    def add_arguments(self, parser):
        parser.add_argument(
            'name', type=str, default=False,
            help="The name of the folder to be created")

    def handle(self, *args, **options):
        pass
Run Code Online (Sandbox Code Playgroud)

python django django-management-command

2
推荐指数
1
解决办法
2250
查看次数

没有工作数据库连接的Django管理命令

我有许多使用以下配置模型的项目:

settings.py包括默认配置和配置规范,主要用于开发目的。默认设置(包括数据库设置)可以被外部配置文件覆盖,外部配置文件通常由管理员针对其管理的各种环境定义。为了减轻管理员的负担,我编写了一个管理命令并单独打包,其中添加了基于默认配置创建示例配置文件的选项。settings.py

但是,尝试运行命令而无法成功进行数据库连接会引发django.db.utils.OperationalError。

如何使该命令在没有数据库连接的情况下工作,因为它不需要一个数据库连接,并且通常在需要该命令时,很可能数据库连接配置不正确。

settings.DATABASES != {} 因为有默认的数据库设置。

Django 1.10.6,Python 3.5.3

python django django-management-command

1
推荐指数
1
解决办法
458
查看次数