2016-06-22 7 views
0

私は、ニュースオブジェクトが作成されるたびにアクティビティオブジェクトを作成するアクティビティモデルを持っています。 Newsオブジェクトにはタグがあります。オブジェクトのフィールドを別のオブジェクトのフィールドにコピーする方法

class Tag(models.Model): 
    slug = models.SlugField() 

class News(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=150) 
    tags = models.ManyToManyField(Tag) 
    activity = GenericRelation(Activity) 

class Activity(models.Model): 
    actor_type = models.ForeignKey(ContentType, related_name='actor_type_activities') 
    actor_id = models.PositiveIntegerField() 
    ... 
    ... 
    target_type = models.ForeignKey(ContentType, related_name='target_type_activities') 
    target_id = models.PositiveIntegerField() 
    target = GenericForeignKey('target_type', 'target_id') 
    tags = models.ManyToManyField(Tag) 

今すぐの信号を使用して、私は

@receiver(post_save, sender=News) 
def create_activity(sender, **kwargs): 
    if kwargs.get('created', False): 
     actor_type = ContentType.objects.get_for_model(kwargs.get('instance').user) 
     actor_id = kwargs.get('instance').user.id 
     target_type = ContentType.objects.get_for_model(kwargs.get('instance')) 
     target_id = kwargs.get('instance').id 
     ... 
     ... 
     # this didn't work 
     tags = kwargs.get('instance').tags.all() 
     # even this didn't work 
     tags = target_type.get_object_for_this_type(id=target_id).tags.all() 

     activity = Activity.objects.get_or_create(
      actor_type=actor_type, 
      actor_id=actor_id, 
      verb=verb, 
      target_type=target_type, 
      target_id=target_id, 
      tags=tags, 
      pub_date=pub_date 
     ) 

、このようにニュースオブジェクトのタグを取得しようとしたしかし、私はエラーを取得しています:

'tags' is an invalid keyword argument for this function

私はニュースオブジェクトのコピーするにはどうすればよいですタグをActivityオブジェクトのタグリストに追加しますか?

答えて

0

私は変数にkwargs.get( 'instance')を格納し、それを使って作業する方がはるかにクリーンであると思います。これはまたあなたのエラーを取り除くでしょう。アクティビティオブジェクトの作成後、タグを割り当てる必要があります。

if kwargs.get('created', False): 
    news_obj = kwargs.get('instance') 
    if not news_obj: 
     return 
    actor_type = ContentType.objects.get_for_model(news_obj.user) 
    actor_id = news_obj.user.id 
    target_type = ContentType.objects.get_for_model(news_obj) 
    target_id = news_obj.id 
    ... 
    ... 
    tags = news_obj.tags.all() 

    activity = Activity.objects.get_or_create(
     actor_type=actor_type, 
     actor_id=actor_id, 
     verb=verb, 
     target_type=target_type, 
     target_id=target_id, 
     pub_date=pub_date 
    ) 

    activity.tags.add(*tags) 
    activity.save() 
+0

こんにちは。私はあなたの道に変えました。今、私は何の誤りもありません。しかし、タグオブジェクトは、アクティビティの作成後にアクティビティオブジェクトに割り当てられません。さらにチェックするために、 'activity.tags.add(* tags)'の後に 'activity.verb =" changed "とし、次に' activity.save() 'という行を追加しました。これは変化しています。ただし、タグはactivity.tagsに割り当てられません。私は何が欠けていますか? – Aamu

+0

うーん、私は他のバグがあるかもしれないと思う。私はあなたがタグを印刷して、本当にそこにいるかどうかを調べるべきだと思います。次に、バルクではなく1つずつ追加しようとすることもできます(ただし、バルクは高速です)。したがって、activity.tags.add(* tags)の代わりに "for t in tags:activity.add(t)"と入力してください。 – steffens21

+0

はい。あなたが正しいです。 'tags = activity.target.tags.all()'と 'activity.verb ="%s "%(tags.first())'を実行したことを確認してください。しかし、最初のタグを取得する代わりに、私が得た動詞は 'None'でした。 – Aamu

0

取得しているトレースバックに注意する必要があります。ここに投稿していないにもかかわらず、Newsからタグを読み取ったときではなく、アクティビティを作成するときにエラーが発生していることが明らかです。これは、モデルをインスタンス化するときに多対多のフィールドのデータを渡すことができないためです。オブジェクトを保存してからM2M関係を割り当てる必要があるからです。

tagsコールをget_or_createコールから取り出し、後で割り当てる必要があります。

+0

こんにちは、私は 'get_or_create'呼び出しからタグ割り当てを取り出して割り当てました。しかし、それでもactivity.tagsは割り当てられていません。さらにチェックするために、activity.tver.add(* tags)の後に、この行を追加しました。activity.verb = "changed"、次にactivity.save()。これは変化しています。ただし、タグはactivity.tagsに割り当てられません。私は何が欠けていますか? – Aamu

関連する問題