在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手动使用和准备字节.
我按照本教程创建了以下自定义管理命令.
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个用户,如果选择"否",则命令将中止.
我认为这可以很容易地完成,因为它发生在一些内置的管理命令中,但它似乎没有涵盖在教程中,甚至在一些搜索和查看内置管理命令的源之后,我无法独自解决这个问题.
我正在努力解决与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) 我已经制作了名为 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
首先,我期待--no-obsolete会注释掉msgid,msgstr如果gettext被删除,对吧?
我的测试方法是:
gettext("some string here")在视野中 写道makemessages命令 .po按预期编写了一个文件 gettext()从视图中删除了行并保存了文件,验证了runserver工作. 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) $ 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
如何将多个参数与命令行中的值一起传递给自定义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.
谢谢
我正在尝试在 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) 我有许多使用以下配置模型的项目:
settings.py包括默认配置和配置规范,主要用于开发目的。默认设置(包括数据库设置)可以被外部配置文件覆盖,外部配置文件通常由管理员针对其管理的各种环境定义。为了减轻管理员的负担,我编写了一个管理命令并单独打包,其中添加了基于默认配置创建示例配置文件的选项。settings.py
但是,尝试运行命令而无法成功进行数据库连接会引发django.db.utils.OperationalError。
如何使该命令在没有数据库连接的情况下工作,因为它不需要一个数据库连接,并且通常在需要该命令时,很可能数据库连接配置不正确。
settings.DATABASES != {} 因为有默认的数据库设置。
Django 1.10.6,Python 3.5.3
django ×9
python ×6
django-admin ×3
django-3.0 ×1
makemessages ×1
pytest ×1
python-3.x ×1
stdout ×1