概要
Djangoアプリケーションにて、DBにある変数をプログラムの指定された変数に代入して一つの文章に連結させる、ということが必要になったので実装しました。
実現すること
DBには以下のように登録されている前提です。
それぞれのsample_syntax
において、part_1
やpart_2
にはプログラム側から文字列が入ります。
それらを連結させて一つの文章にしたい、ということです。
モデル定義は以下の通りです。
models.py
class Syntax(models.Model):
sample_syntax = models.TextField(null=True, blank=True)
class Meta:
db_table = 'syntax'
サンプルコード
from sample.models import Syntax
# 例えばの変数
sample_1 = "1番目!"
sample_2 = "2番目!"
sample_3 = "3番目!"
sample_4 = "4番目!"
sample_syntax1 = Syntax.objects.get(id=1).sample_syntax
sample_syntax2 = Syntax.objects.get(id=2).sample_syntax
syntax_variables = {
'part_1': sample_1,
'part_2': sample_2,
'part_3': sample_3,
'part_4': sample_4
}
print(syntax_variables)
# {'part_1': '1番目!', 'part_2': '2番目!', 'part_3': '3番目!', 'part_4': '4番目!'}
# ただ繋げるだけで良い場合
def syntax_just_join(syntax, syntax_variables):
syntax = {key: syntax_variables[key] for key in syntax.split(' + ') if key in syntax_variables}
syntax_comment = ''.join(str(syntax[key]) for key in syntax)
print(syntax_comment)
# 1番目!2番目!3番目!4番目!
syntax_just_join(sample_syntax1, syntax_variables)
# 文字列を含めて繋げる場合
def syntax_join_with_strings(syntax, syntax_variables):
syntax_parts = syntax.split(' + ')
syntax_comment = ''.join(str(syntax_variables.get(key, key)) for key in syntax_parts)
print(syntax_comment)
# 1番目!固定の文言を入れます!2番目!3番目!4番目!
syntax_join_with_strings(sample_syntax2, syntax_variables)
print
の出力結果は上記の通りです。
もし登録したレコードの中に固定の文字列がない場合は、指定された変数を参照していくだけなので1番目の方でも問題ありません。
しかし、もし固定文言をDB側で持たせておく場合は、2番目の場合のようにする必要があります。具体的には.get()
メソッドを使ってsyntax_variables
辞書から変数を取得し、もし辞書内にキーが存在しない場合はそのままキーを返すようにしています。これはget
メソッドの「デフォルト値」と呼ばれるものです。
ちなみに、以下のコードでも同じように実現できました。
ただし、上述の方がコードの可読性が高いかなと思います。
def syntax_join_with_strings(syntax, syntax_variables):
syntax_comment = ''
for key in syntax.split(' + '):
if key in syntax_variables:
syntax_comment += str(syntax_variables[key])
else:
syntax_comment += key
print(syntax_comment)
# 1番目!固定の文言を入れます!2番目!3番目!4番目!
syntax_join_with_strings(sample_syntax2, syntax_variables)