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
})