У меня есть модель деятельности, которая создает объект активности всякий раз, когда создается объект новостей. Объект 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)
Теперь с помощью сигналов, я пытался получать тег объекта News в этом пути,
@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?
Hi. Я изменил его на свой путь. Теперь у меня нет ошибок. Но объекты тега также не присваивают объекту активности после создания действия. Чтобы проверить далее, после 'activity.tags.add (* tags)' я добавил эту строку 'activity.verb =" changed ", а затем' activity.save() '. Это меняется. Однако теги не присваиваются activity.tags. Что мне не хватает? – Aamu
Хм, наверное, могут быть и другие ошибки. Я думаю, вам стоит попробовать распечатать теги и проверить, действительно ли они там. Затем вы можете также попытаться добавить их по одному, а не навалом (хотя навалом быстрее). Таким образом, вы бы заменили activity.tags.add (* tags) на «для t в тегах: activity.add (t)» – steffens21
Да. Ты прав. Чтобы убедиться, что я сделал это 'tags = activity.target.tags.all()', а затем 'activity.verb ="% s "% (tags.first())'. Но вместо того, чтобы получить первый тег, глагол, который я получил, был «Нет». – Aamu