私は、ニュースオブジェクトが作成されるたびにアクティビティオブジェクトを作成するアクティビティモデルを持っています。 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オブジェクトのタグリストに追加しますか?
こんにちは。私はあなたの道に変えました。今、私は何の誤りもありません。しかし、タグオブジェクトは、アクティビティの作成後にアクティビティオブジェクトに割り当てられません。さらにチェックするために、 'activity.tags.add(* tags)'の後に 'activity.verb =" changed "とし、次に' activity.save() 'という行を追加しました。これは変化しています。ただし、タグはactivity.tagsに割り当てられません。私は何が欠けていますか? – Aamu
うーん、私は他のバグがあるかもしれないと思う。私はあなたがタグを印刷して、本当にそこにいるかどうかを調べるべきだと思います。次に、バルクではなく1つずつ追加しようとすることもできます(ただし、バルクは高速です)。したがって、activity.tags.add(* tags)の代わりに "for t in tags:activity.add(t)"と入力してください。 – steffens21
はい。あなたが正しいです。 'tags = activity.target.tags.all()'と 'activity.verb ="%s "%(tags.first())'を実行したことを確認してください。しかし、最初のタグを取得する代わりに、私が得た動詞は 'None'でした。 – Aamu