目录

    主要记录最近遇到的一些开发问题,解决方法。

    1. Python2 和 Python3 中的异常处理

    Python2,Python3 都支持的两种方式:

    • 带参数
    except (ExceptionType) as Argument:
        # 访问 Argument
    
    • 不带参数
    except ExceptionType:
    

    仅 Python2 支持的方式:

    except ExceptionType, Argument:
        # 访问 Argument
    

    2. Django 中的 get_object_or_404 和 get_queryset

    get_object_or_404 通过使用 get 获取对象,否则返回 404

    from django.shortcuts import get_object_or_404
    from django.forms.models import model_to_dict
    from django.http import JsonResponse
    from .models import Fruit
    
    
    def filter404(request):
        obj = get_object_or_404(Fruit, title='aa')
        return JsonResponse(model_to_dict(obj))
    

    使用 get_queryset 可以全局的定制查询行为,包括 admin

    class FruitManager(models.Manager):
        def get_queryset(self):
            return super(FruitManager, self).get_queryset().filter(is_delete=False)
    

    3. 树形结构存储

    • 物化路径

    每个节点存储其完整路径编码。

    Name        Path
    William     1
    Jones       1/1
    Blake       1/2
    Adams       1/2/1
    

    优点是读取和写入都非常快。

    • 邻接表模型

    邻接列表表示通过保持到某些相邻节点的链接来存储树。

    Name        Parent     Next
    William     null       Joseph
    Jones       William    Blake
    

    优点是,结构简单易懂,但是数据量很大时,基于递归的查询效率非常低。

    • 嵌套集

    每个节点存储一些索引(通常是左右值)。

    Name        left   right
    William     1      10
    Jones       2      3
    Blake       4      7
    

    优点是查询数据很快,但是更新时,需要修改的节点很大。

    • 区间嵌套集

    将区间映射为二维空间,每一个节点根据规则对应一个分数。在涉及节点位置的层次查询时,不需要访问数据库。优点是,性能非常好,但是实现和理解起来有一点门槛。

    django-treebeard 实现了物化路径,嵌套集和邻接列表。 django-mptt 混合了嵌套集和邻接列表,能高效地查询子节点,被破坏时可以重建树。

    4. Pytest 找不到模块报错

    报错信息:

    =================================== ERRORS ====================================
    _____________ ERROR collecting home_application/test/test_mptt.py _____________
    ImportError while importing test module 'C:\pytest\home_application\test\test_mptt.py'.
    Hint: make sure your test modules/packages have valid Python names.
    Traceback:
    ImportError: No module named home_application.test.test_mptt
    

    问题原因:

    test 目录下,存在 __init__.py 文件,导致 Pytest 将整个 test 当作一个模块来处理。实际上,我们需要的是 Pytest 进入目录,找到 test_ 开头的文件,运行测试。只需要删除 __init__.py 文件即可。

    5. CentOS 7 中 /etc/rc.local 开机不自动运行

    查看 /etc/rc.local 内容发现:

    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    

    CentOS 7 建议创建 systemd 用于开机自启动。

    如果需要使用旧的方式,则需要添加到 /etc/rc.d/rc.local。同时,执行 chmod +x /etc/rc.d/rc.local,赋予可执行权限。

    6. Secure shell Extension 插件 NaCI 退出,状态 255

    报错原因是本地保存的指纹信息与主机信息不符。

    解决办法:

    在 shell 窗口,按下 Ctrl+Shift+J 进入调试窗口,在 console 执行:

    term_.command.removeAllKnownHosts()
    

    清空 known_hosts 即可。

    7. Python 续行的几种方式

    1,利用反斜杠

    a = 'sdfaf' \
        'test'
    
    a = '1' + '2' + '3' + \
        '4' + '5'
    
    if False and \
        True:
        pass
    

    2, 利用括号

    a = ('sdfaf' 
        'test')
    
    a = ('1' + '2' + '3' +
        '4' + '5')
    
    if(False and 
        True):
        pass