0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python(Django) x Docker x AWSAdvent Calendar 2023

Day 11

【Django】DBにある「変数」をプログラムの指定された「変数」に代入して一つの文字列として連結させる方法

Posted at

概要

Djangoアプリケーションにて、DBにある変数をプログラムの指定された変数に代入して一つの文章に連結させる、ということが必要になったので実装しました。

実現すること

DBには以下のように登録されている前提です。

image.png

それぞれのsample_syntaxにおいて、part_1part_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)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?