NOIZE
@NOIZE

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

保存時に自動でManyToManyフィールドにオブジェクトを追加し保存したい

Q&A

Closed

解決したいこと

管理画面で保存を実行した時、自動的にManyToManyフィールドに値を追加したいが、保存されない。


以下の操作を実行し保存したい。

【漢文】
子曰、學而時習之、不亦說乎。有朋自遠方來、不亦樂乎。人不知而不慍、不亦君子乎。
↓ 分解してリスト化
['慍', '有', '乎', '遠', '之', '習', '學', '朋', '來', '自', '曰', '君', '而', '說', '亦', '方', '人', '時', '知', '子', '不', '樂']

for文で回してmanytomanyフィールドに追加


発生している問題・エラー

エラーなし

該当するソースコード

現状3パターンやってみました。

  1. モデルのsave()をオーバーライド
  2. ModelAdminのsave_model()をオーバーライド
  3. 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)

ModelAdminpre_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

No Answers yet.

Your answer might help someone💌