2017-04-19 5 views
1

多量のフィールドにアイテムのリストを一括して追加しようとするのに少し問題があります。この。私はDjangoのドキュメントを見て、私が探しているものを見つけることができないようです。ここでDjango 1つのフィールドのテキストから多数のフィールドに生成されたリストを追加する

は私のモデルのためのコードです:

class Subject(models.Model): 
    noun = models.CharField(max_length=30, null=True, blank=True) 

class Knowledge(models.Model): 
    item_text = models.TextField() 
    item_subjects = models.ManyToManyField(Subject, null=True, blank=True) 

def add_subjects(sender, instance, *args, **kwargs): 

    if instance.item_info: 
     item_subjects = classifier.predict_subjects(instance.item_info) 

     if item_subjects: 
      .... 

post_save.connect(add_subjects, sender=Knowledge) 

リストはclassifer.predict_subjects機能によって生成されています。 m2m_changedコネクタを使用して、pre_savepost_saveを接続しようとしました。私は多くの分野から多くの分野が正しい選択肢であるとは確信していませんが、外資関係を成立させる方が良いでしょう。 '...'の代わりに を使用しましたが、これを試しましたが、関係を作成せず、最後のものだけを保存します。

for sub in item_subjects: 
    subject = Subject(id=instance.id, noun=sub) 
    subject.save() 

また、私は本当に私は本当に私は正直に言うと、右球場にいるとは思わない、覚えていないこと

instance.item_subjects = item_subjects 

と負荷より多くの事を試してみました。助言がありますか?

編集:

OK、それはリスト項目のすべてを追加することが、まだ多くの分野に多くのこれらのアイテムをリンクするために管理していないので、私が持っています。

 for sub in item_subjects: 
      subject = Subject.objects.get_or_create(noun=sub) 

編集2:だから正確にDjangoのシェル内のループの外に同じことを動作しているようだと、エントリが保存されますが、それは関数内でないほとんどをやって

。 3

>>> k[0].item_subjects.all() 
<QuerySet []> 
>>> d, b = Subject.objects.get_or_create(noun="cats") 
<Subject: cats> 
>>> k[0].item_subjects.add(d) 
>>> k[0].item_subjects.all() 
<QuerySet [<Subject: cats>]> 

編集だから私はロバートが提案し、それがちょうどちょうどadminインタフェースでそれを使用していない時には、上記のようなシェルにどのような作品でした。私のコードのprintステートメントは、更新されている配列アイテムを示していますが、それは残っていません。私は周りを読んで、これは管理フォームを保存する前にアイテムをクリアすると問題があるようです。

def sub_related_changed(sender, instance, *args, **kwargs): 

    print instance.item_subjects.all() 

    if instance.item_info: 
     item_subjects = classifier.predict_subjects(instance.item_info) 

     if item_subjects: 
      for sub in item_subjects: 
       subject, created = Subject.objects.get_or_create(noun=sub) 
       instance.item_subjects.add(subject) 

     print instance.item_subjects.all() 


post_save.connect(sub_related_changed, sender=Knowledge) 

次のように私はm2m_changed信号としての機能を使って試してみました:

m2m_changed.connect(model_saved, sender=Knowledge.item_subjects.through) 

しかし、これは再帰ループを生成したり、火しませんか。あなたは(あなたがあなたの編集に持っているとして)subjectオブジェクトを持っていたら

答えて

0

、あなたは「item_subjects」属性は、関連項目を管理する方法です

for sub in item_subjects: 
    subject, created = Subject.objects.get_or_create(noun=sub) 
    instance.item_subjects.add(subject) 

でそれらを追加することができます。スルー関係は、「追加」メソッドを介して作成されます。

あなたはこれをしたら、あなたはinstance.item_subjects.filter(noun='foo')instance.item_subjects.all().delete()のようなことを行うので、

ドキュメントの参考にすることができます:https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_many/

EDIT ああ、私はこれはで行われていたことを認識していませんでしたDjango管理者。私はそれが問題だとあなたは正しいと思います。保存すると、管理者は2つのメソッドを呼び出します。最初はモデルのsave()メソッドを呼び出すmodel_save()です(このコードが存在すると仮定します)。それが呼び出す2番目のメソッドは "Save_related"です。まずManyToMany関係をクリアし、送信されたフォームデータに基づいてそれらを保存します。あなたの場合、保存時にオブジェクトを作成しているので、有効なフォームデータはありません。

このコードの関連する部分をadminのsave_related()メソッドに入れると、変更は持続するはずです。

<アプリ> /models.pyアプリと<アプリ> /admin.pyファイルの両方を投稿する場合は、より具体的にどのようにすればよいでしょうか。別のSO質問から

参考:あなたの助けを Issue with ManyToMany Relationships not updating inmediatly after save

+0

おかげで、そのはまだいくつかの理由のために働いていません。 djangoシェルでも同じことを試してみましょう。例えば ​​'>>> [0] .item_subjects.allを()は、k >>> D、B = Subject.objects.get_or_create(名詞= "ネコ") >>> D <件名:ネコ> > >>> k [0] .item_subjects.all() ]> 'ここで何かする必要があります。 –

+0

それはシェルでうまくいってうれしいです。 .add()メソッドを追加したので、シェルの外で使っている新しいコード(まだ動作していないコード)を表示するように編集しますか? –

+0

kkありがとう、もう一度更新しました。 –

関連する問題