多量のフィールドにアイテムのリストを一括して追加しようとするのに少し問題があります。この。私は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_save
とpost_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
オブジェクトを持っていたら
おかげで、そのはまだいくつかの理由のために働いていません。 djangoシェルでも同じことを試してみましょう。例えば '>>> [0] .item_subjects.allを()は、k >>> D、B = Subject.objects.get_or_create(名詞= "ネコ") >>> D <件名:ネコ> > >>> k [0] .item_subjects.all() ]> 'ここで何かする必要があります。 –
それはシェルでうまくいってうれしいです。 .add()メソッドを追加したので、シェルの外で使っている新しいコード(まだ動作していないコード)を表示するように編集しますか? –
kkありがとう、もう一度更新しました。 –