2016-08-23 4 views
0

マイコンテンツモデルにタグモデルとの多対多の関係があります。 Contentオブジェクトを保存するときに、関係を動的に追加する必要があります。私はこれを次のようにしています。非ハッシュタイプ:Djangoでpost_saveを使用してm2mリレーションシップを動的に追加しようとすると 'list'エラーが発生する

def tag_content(obj): 
    obj.tags.add([1,2,3]) 
    obj.is_tagged = True 
    obj.save() 
    return obj 

class Tag(models.Model): 
    name = models.CharField(max_length=255) 

class Content(models.Model): 
    title = models.CharField(max_length=255) 
    is_tagged = models.BooleanField(default=False) 
    tags = models.ManyToManyField(Tag, blank=True) 

    def save(self, *args, **kwargs): 
     super(Content, self).save(*args, **kwargs) 

@receiver(post_save, sender = Content) 
def update_m2m_relationships_on_save(sender, **kwargs): 
    if not kwargs['instance'].is_tagged: 
     tag_content(kwargs['instance']) 

基本的には、コンテンツオブジェクトが保存されている場合、受信機は、順番にM2M関係を追加するtag_contentメソッドを呼び出しpost_saveメソッドを呼び出すために使用されています。しかし、私はこのエラーを受け取ります:

TypeError 
unhashable type: 'list' 

具体的には.add()関数を参照しています。なぜ私はこのエラーが表示されますか?どんな助けもありがとうございます。また、データベースにids = 1、2、3のTagオブジェクトがあることに注意してください。

EDIT

さてさて、私はこのような何かに私のtag_contentを変更:

def tag_content(obj): 
    for tag in Tag.objects.all(): 
     print tag 
     obj.tags.add(tag) 

add()メソッドは、オブジェクトインスタンスではなく、IDSにかかるためです。しかし、それでも動作しません:/私はエラーはありませんが、関係は単に確立されていません。

これは、print tagコマンドが機能し、タグを出力するので、特に奇妙です。つまり、関数が呼び出されています。助けてください? Btw、私はDjango 1.9.8を実行しています。

+0

実行中のDjangoのバージョンは? –

+0

re:あなたの編集、あなたは 'obj.save()'を実行していますか?あなたは以前のバージョンでやったよ –

+0

はい私はsaveメソッドを実行しています。 –

答えて

1

add docsによれば、実際のモデルをargsとして渡す必要があります。

実際にモデルのリストが必要な場合は、アンパックする必要がありますが、この場合は直接引数としてobjを渡すこともできます。

+0

私は質問を更新しました。それをチェックできますか? –

2

add()にリストを渡すことができないため、エラーが発生します。あなたのいずれかは、一度に1つのアイテムを追加または引数、例えば、一連のにリストを展開する必要があります。

obj.tags.add(*[1,2,3]) # The * expands the list into the function arguments 

あなたはadd()にIDを渡すことはできませんので、これはまだエラーが発生します - あなたはにTagオブジェクトを渡す必要がありますそれ。だからこのような何かが動作します:

# Get a list of Tag objects 
tags_to_add = [Tag.objects.get(id=j) for j in [1, 2, 3]] 
# Now pass this to the add() function: 
obj.tags.add(*tags_to_add) 
+0

私は質問を更新しました。それをチェックできますか? –

関連する問題