4月の研究概要

1.デプロイメントパッケージのエラーケース:
エラーの内容:

------STARTING: Migrate Database------

Traceback (most recent call last):

  File "manage.py", line 19, in 

    execute_from_command_line(sys.argv)

  File "/cache/.bk/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line

    utility.execute()

  File "/cache/.bk/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 303, in execute

    settings.INSTALLED_APPS

  File "/cache/.bk/env/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__

    self._setup(name)

  File "/cache/.bk/env/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup

    self._wrapped = Settings(settings_module)

  File "/cache/.bk/env/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__

    mod = importlib.import_module(self.SETTINGS_MODULE)

  File "/cache/.bk/env/lib/python2.7/importlib/__init__.py", line 37, in import_module

    __import__(name)

  File "/data/app/code/settings.py", line 2, in 

    from conf.default import *

SystemError: NULL result without error in PyObject_Call

------FAILURE: Migrate Database------

[192.168.10.112]20200418-160926 105   [JOB FAILURE]

現象:migrateのローカル実行は正常であり、デプロイメントエラーが報告されます。
原因と解決策:デプロイされたコードパッケージに.pycファイルがあります。すべての.pycファイルを削除して再度デプロイすると、この問題は発生しません。
推奨事項:独自のコードをローカルにパッケージ化しないでください。
2.標準の操作とメンテナンス、自分で開発したjsモジュールはstaticfileコマンドに同期されます。

python manage.py collectstatic --noinput

3.ファイルアップロードユニットテストで
は、ファイルストリームデータをシミュレートする必要があります

def test_upload_file(self):
    import io
    data = {
        'file': io.StringIO('some initial text datal')
    }
    r = self.client.post('/api/contract/upload_file/', data=data,
                         ccontent_type='application/json')
    self.assertEqual(r.status_code, 200)
    content = json.loads(r.content)
    print(content)
    self.assertEqual(content['result'], True)
    success_data = {
        'result': bool,
        'code': str,
        'message': str,
        'data': {}
    }
    self.judge_assert(content, self.data_reform(success_data))

4. DjangoORM操作のフィルタリングを除外します。

exclude(筛选条件1,筛选条件2)
筛选出来的结果为,数据库中,过滤掉同时符合两个筛选条件的那些数据

exclude(筛选条件1).exclude(筛选条件2)
筛选出来的结果为,数据库中,先过滤掉符合筛选条件1的数据,再在一的基础上过滤掉符合筛选条件2的数据,结果为去掉了,至少符合其中一个筛选条件的所有数据

注:2番目の効果を最初の文法的実現と間違えないでください。

5.コードパッケージ展開用のデータの初期化。
データは非常に重要です。プロジェクトはアップグレードせずに展開できますが、データが失われたり汚染されたりすることはありません。初期化されたデータはいくつかの条件を満たす必要があると思います
。①存在しない
データは更新可能です。②データベースのソースデータを変更することは禁止されています。③
初期化されるデータは、顧客のデータと重複しないように構成データである必要があります。
④重大な事故を未然に防ぐため、必ずデータをバックアップする前にデータを初期化してください。
初期化されたデータコードは次のとおりです。効果:既存のものは変更されず、存在しないものが作成されます。
init.pyファイル

# -*- coding: utf-8 -*-

default_app_config = 'apps.zabbix.apps.ModulesConfigConfig'

apps.pyファイル

def app_ready_handler(sender, **kwargs):
    from apps.zabbix.models import ModulesConfig, ThresholdConfig, EnvironmentVariable, RequestConfig
    from apps.home.models import ConstantInfo
    ConstantInfo.init_data()
    print("update ConstantInfo")
    print("update Modules Config")
    ModulesConfig.init_data()
    print("update Threshold Config")
    ThresholdConfig.init_data()
    print("update EnvironmentVariable Config")
    EnvironmentVariable.init_data()
    print("update Request Config")
    RequestConfig.init_data()


class ModulesConfigConfig(AppConfig):
    name = 'apps.zabbix'

    def ready(self):
        post_migrate.connect(app_ready_handler, sender=self)

model.pyファイル(ここには1つだけが表示されています)

# -*- coding: utf-8 -*-
from django.db import models
from .contants import (MODULES, MAX_XX_LEN, MAX_XXX_LEN, REQUEST_METHOD, THRESHOLD_CONFIG, SORT_ORDER, ENV_CONSTANT,
                       REQUEST_CONSTANT)
from common.log import logger
import json


class ModulesConfig(models.Model):
    key = models.CharField(verbose_name=u'zabbix请求内容唯一标志', max_length=MAX_XX_LEN, null=True)
    desc = models.CharField(verbose_name=u'描述', max_length=MAX_XXX_LEN, null=True, blank=True)
    method = models.CharField(verbose_name=u'zabbix请求method', max_length=MAX_XX_LEN, null=True)
    params = models.TextField(verbose_name=u'请求参数配置', null=True)

    class Meta:
        app_label = "zabbix"
        db_table = "zabbix_module_config"
        verbose_name = u"模块请求配置"

    @classmethod
    def init_data(cls):
        try:
            for item in MODULES:
                cls.objects.get_or_create(
                    key=item['key'],
                    defaults={
                        "key": item['key'],
                        "desc": item['desc'],
                        "method": item['method'],
                        "params": json.dumps(item["config"])
                    }
                )
        except Exception as e:
            logger.error('init module config fail, errror: %s' % e)

注:DjangoのORM操作のget_or_createメソッド。設定したキーフィールドが取得された場合、更新されません。取得されていない場合、ソースデータの変更を回避するために作成されます。

6. Django ORM
グループ表示フィールドのグループ化は、外部キーテーブルの他のフィールドに追加されます。
外部キー名+ __ +次の
ような外部キーテーブルの関連フィールド:c_type__name

def home_info(self, request):
    contract_queryset = Contract.objects.exclude(is_delete=1)
    # 除归档的合同
    contract_count_list = contract_queryset.exclude(status=3)
    # 过期的合同数
    expire_count_list = contract_queryset.filter(status=2)

    # 合同过期折线图
    month = request.GET.get('number', 12)
    expire_data = []
    x_data = list(reversed([x for x in self.date_range(num=int(month))]))
    for item in x_data:
        task_record = expire_count_list.filter(create_time__year=int(item[0:4]),
                                               create_time__month=int(item[-2:]))
        expire_data.append(len(task_record))

    # 合同类型饼状图数量统计
    c_type_data = contract_queryset.values('c_type', 'c_type__name').annotate(count=Count('c_type')).all()

    # 合同类型正常财产统计
    normal_cost = contract_queryset.values('c_type', 'c_type__name').annotate(cost=Sum('cost'))
    return Response({
        'contract_count': contract_count_list.count(),
        'expire_count': expire_count_list.count(),
        'expire_data': {
            'data': expire_data,
            'xAxis': x_data
        },
        'c_type_data': c_type_data,
        'normal_cost': normal_cost
    })

おすすめ

転載: blog.csdn.net/qq_42631707/article/details/105575639