小编nie*_*kas的帖子

South:如何在生产服务器中恢复迁移?

我想通过运行它的Migration.backwards()方法来恢复我的最后一次迁移 (0157) 。由于我正在恢复生产服务器中的迁移,因此我想在代码部署期间自动运行它。部署脚本执行以下步骤:

  1. 拉取代码更改
  2. 运行迁移: manage.py migrate <app>
  3. 刷新 Apache 以使用最新代码: touch django.wsgi

如果可以,我会创建新的迁移文件,告诉 South 向后迁移到 0156:

migrations/0158_backward__migrate_to_0156.py
Run Code Online (Sandbox Code Playgroud)

此提交的迁移将部署到生产并在manage.py migrate <app>命令期间执行。在这种情况下,我不必像这些答案中建议的那样手动执行向后迁移。

可以说,我创建了两个数据迁移,第一个用于用户的支付,第二个用于用户模型。我已经为这两种迁移实现了 reverses() 方法,以防我不得不恢复这些数据迁移。我已将这两个迁移部署到生产中。突然发现支付迁移包含错误。我想尽快恢复我最近的两次数据迁移。什么是最快安全的方法?

python migration django django-south dev-to-production

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

Python:如何检查路径是否是子路径

让我们说我有这些路径:

/tmp/a
/tmp/abc
/tmp/abc/d/my_file.py
Run Code Online (Sandbox Code Playgroud)

我怎么能检查是否/tmp/abc/d/my_file.py是一个子路径/tmp/abc?我试过了:

file_path.startswith(dir_path)
Run Code Online (Sandbox Code Playgroud)

但它返回True/tmp/a目录,而my_file.py不是它.

python directory python-2.7

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

pip 安装最新的依赖版本

当我使用pip install -e .它安装我的包时,它只安装不满意的依赖项并忽略依赖项升级。每次运行时如何安装最新的依赖版本pip install -e .

我曾尝试使用pip install --upgrade -e .,但使用此选项没有任何变化,我仍然收到Requirement already satisfied, skipping upgrade: <dependency>通知而不是安装最新的可用版本。

我的setup.py文件:

from setuptools import setup, find_packages

setup(
    name='test_package',
    author='test',
    author_email='test@example.com',
    description='Test package',
    version='0.0.1',
    packages=find_packages(),
    install_requires=[
        'pyyaml',
        'requests',
    ],   
    python_requires='>=3.6'
)
Run Code Online (Sandbox Code Playgroud)

python pip setup.py python-3.x

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

django_channels“读取器位于文件末尾”异常

我已经实现了django_channels AsyncJsonWebsocketConsumer订阅"chat"组的消费者:

from channels.generic.websocket import AsyncJsonWebsocketConsumer

class CeleryTaskConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add(group='chat', channel=self.channel_name)

    async def new_message_handler(self, event):
        await self.send_json(content={'event': event})
Run Code Online (Sandbox Code Playgroud)

然后我会定期向群组发送消息"chat"

import channels.layers
from asgiref.sync import async_to_sync

def send_notification():
    channel_layer = channels.layers.get_channel_layer()
    async_to_sync(channel_layer.group_send)("chat", {
        'type': 'new.message.handler',
        'message': 'Hello world!'
    })
Run Code Online (Sandbox Code Playgroud)

一切都按预期进行,但是我经常遇到此异常:

Exception inside application: Reader at end of file
  File "/usr/lib64/python3.6/asyncio/coroutines.py", line 129, in throw
    return self.gen.throw(type, value, traceback)
  File "/venv/lib64/python3.6/site-packages/channels/consumer.py", line 59, in __call__
    [receive, self.channel_receive], self.dispatch
  File "/usr/lib64/python3.6/asyncio/coroutines.py", line …
Run Code Online (Sandbox Code Playgroud)

python django websocket django-channels

5
推荐指数
0
解决办法
1433
查看次数

DRF ModelSerializer 使所有字段为只读,而无需明确指定它们

我能够制作只读模型序列化器,例如:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = ['name', 'ratio']
        read_only_fields = fields
Run Code Online (Sandbox Code Playgroud)

但是,我倾向于频繁添加/删除字段Foo。如果每次Foo修改序列化器时不更新它会容易得多。这fields = '__all__'非常方便:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = '__all__'
        read_only_fields = fields
Run Code Online (Sandbox Code Playgroud)

但是,read_only_fields不接受__all__作为有效选项并引发此异常:

Exception Type: TypeError at /api/foo/
Exception Value: The `read_only_fields` option must be a list or tuple. Got str.
Run Code Online (Sandbox Code Playgroud)

如何将所有字段标记为只读而不显式地将每个字段添加到read_only_fields列表中?

serialization django-models python-3.x django-rest-framework

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

Django 迁移:“elidable”参数的用途是什么?

RunPython在迁移中进行了操作,例如其中一项迁移:

class DataMigration(migrations.Migration):
    dependencies = [('app1', '0001_initial')]

    operations = [
        migrations.RunPython(create_data, delete_data, elidable=True),
    ]
Run Code Online (Sandbox Code Playgroud)

此操作接受一个可选参数,该参数在Django 文档elidable中进行了描述:

可选的 Elidable 参数确定在压缩迁移时是否删除(消除)该操作。

这个描述让我有点困惑。elidable=True我的问题是:当带标志的迁移被压制时会发生什么?

我想迁移 withelidable=True会被简单地删除。并且必须采取一些手动步骤才能将删除的迁移逻辑添加到压缩的迁移逻辑中。

django python-3.x django-migrations

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

按索引对 numpy.array 行进行排序

我有 2Dnumpy.array和一组索引:

a = array([[0, 0], [0, 1], [1, 0], [1, 1]])
ix = (2, 0, 3, 1)
Run Code Online (Sandbox Code Playgroud)

如何按索引对数组的行进行排序?预期结果:

array([[1, 0], [0, 0], [1, 1], [0, 1]])
Run Code Online (Sandbox Code Playgroud)

我尝试使用numpy.take,但它仅适用于一维数组。

python arrays numpy python-2.7

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

Python 中有不可变字典类型吗?

我想定义一个函数,它有类似字典的参数,例如:

def my_func(params={'skip': True}):
    print(params['skip'])
    params['skip'] = False
Run Code Online (Sandbox Code Playgroud)

但是,如果使用可变字典dict()- 它只会为函数创建一次。对该字典所做的修改会在下一次调用期间出现。

my_func()  # prints True
my_func()  # prints False
Run Code Online (Sandbox Code Playgroud)

目前我唯一的想法是使用键/值对的元组,它可以转换成字典,而不是提供类似字典的数据。

def my_func(params=(('skip', True))):
    params = dict(params)
    print(params['skip'])
    params['skip'] = False
Run Code Online (Sandbox Code Playgroud)

但是,我真的很想避免这种对字典的显式转换。我的问题是:是否有一个不可变字典替代 for ,dict()因为有tuple()for list()

python dictionary arguments immutability

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

如何将标准timedelta字符串转换为timedelta对象

将标准timedelta字符串转换为timedelta对象的最简单方法是什么?

我已经打印了几个timedelta对象并获​​得了这些字符串:

'1157 days, 9:46:39'
'12:00:01.824952'
'-1 day, 23:59:31.859767'
Run Code Online (Sandbox Code Playgroud)

我知道我自己可以编写解析器,但有没有更简单的解决方案?

python datetime

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

Django中不区分大小写的查询集排序

是否有可能对Django queryset case不敏感地排序?这个查询:

MyModel.objects.order_by('title')
Run Code Online (Sandbox Code Playgroud)

使用区分大小写排序.结果如下排序:

X..
a..
b..
Run Code Online (Sandbox Code Playgroud)

但我想对这样的标题进行排序:

a..
b..
X..
Run Code Online (Sandbox Code Playgroud)

python sqlite django django-queryset

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

如何在不使用reverse = True参数的情况下以相反顺序对字符串列表进行排序?

我想以相反的顺序对字符串列表进行排序,例如:

my_list = ['aaa', 'bbb', 'ccc']
Run Code Online (Sandbox Code Playgroud)

预期结果:

['ccc', 'bbb', 'aaa']
Run Code Online (Sandbox Code Playgroud)

我不想使用sorted(my_list, reverse=True),因为在更复杂的情况下,按两个值进行过滤将无法正常工作。例如:

my_list2 = [('aaa', 'bbb'), ('aaa', 'ccc'), ('bbb', 'aaa'), ('bbb', 'ccc')]
Run Code Online (Sandbox Code Playgroud)

预期结果将是:

[('bbb', 'aaa'), ('bbb', 'ccc'), ('aaa', 'bbb'), ('aaa', 'ccc')]
Run Code Online (Sandbox Code Playgroud)

sorted(my_list2, reverse=True) 返回:

[('bbb', 'ccc'), ('bbb', 'aaa'), ('aaa', 'ccc'), ('aaa', 'bbb')]
Run Code Online (Sandbox Code Playgroud)

用数字很简单,您可以取反值:

>>> my_list3 = [(1, 2), (1, 3), (2, 1), (2, 3)]
>>> sorted(my_list3, key=lambda x: (-x[0], x[1]))
... [(2, 1), (2, 3), (1, 2), (1, 3)]
Run Code Online (Sandbox Code Playgroud)

但是如何使用字符串呢?

python sorting string list python-3.x

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

如何在Python中查找两个日期之间的工作日数?

我有两个日期作为datetime.date对象,查找这两个日期之间的工作日数(包括开始日期和排除结束日期)的最 Pythonic 方法是什么?例如:

from datetime import date, timedelta

d1 = date(2019, 3, 1)
d2 = date(2019, 5, 6)
# The difference between d2 and d1 is 46 workdays
Run Code Online (Sandbox Code Playgroud)

我想到写一个循环:

workdays = 0
for i in range((d2 - d1).days):
    if (d1 + timedelta(days=i)).isoweekday() <= 5:
        workdays += 1
Run Code Online (Sandbox Code Playgroud)

不过,我认为有一个更简单的方法可以解决这个问题。

python date python-3.x

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