保存時に自動でManyToManyフィールドにオブジェクトを追加し保存したい
解決したいこと
管理画面で保存を実行した時、自動的にManyToManyフィールドに値を追加したいが、保存されない。
以下の操作を実行し保存したい。
【漢文】
子曰、學而時習之、不亦說乎。有朋自遠方來、不亦樂乎。人不知而不慍、不亦君子乎。
↓ 分解してリスト化
['慍', '有', '乎', '遠', '之', '習', '學', '朋', '來', '自', '曰', '君', '而', '說', '亦', '方', '人', '時', '知', '子', '不', '樂']
↓
for文で回してmanytomanyフィールドに追加
発生している問題・エラー
エラーなし
該当するソースコード
現状3パターンやってみました。
- モデルの
save()
をオーバーライド - ModelAdminの
save_model()
をオーバーライド - Signalを使う
pre_save
文字列と重複処理はprint()
で正しく表示されています。
models.py
#### case 1 models.py ####
""" モデルのSaveメソッドで処理 """
class Word(models.Model):
name = models.CharField(max_length=100, unique=True)
class Section(models.Model):
word = models.ManyToManyField(Word, blank=True)
original = models.TextField(unique=True)
def save(self, *args, **kwargs):
# 文字列処理
punctuation_pattern = re.compile('[、。.!?]')
kaigyou_pattern = re.compile(r'[\n\r]')
cleaned_text = re.sub(punctuation_pattern, '', self.original)
kanjis = re.sub(kaigyou_pattern, '', cleaned_text)
# 重複処理
kanji_list = list(set(kanjis))
print("kanji_list:", kanji_list)
# m2mフィールドに追加
for kanji in kanji_list:
word_obj, created = Word.objects.get_or_create(name=kanji)
self.word.add(word_obj)
print(f"{kanji}を追加")
super().save(*args, **kwargs)
ModelAdmin
とpre_save
でもsave()
と同様のコードを使いました。
py
#### case 2 ModelAdmin ####
""" admin画面での操作なのでsave_modelメソッドで処理 """
class SectionAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
#同様の処理
#### case 3 signals.py ####
""" pre_saveシグナルを使う。 """
@receiver(pre_save, sender=Section)
def update_word_of_section(sender, instance, **kwargs):
#同様の処理
- エラーなし
- 管理画面上で保存
- Section保存時、wordフィールド(m2m)に自動で追加保存
どのようにすれば保存されますでしょうか?
よろしくお願いしますm(_ _)m
0