2016-06-22 3 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) 

Теперь с помощью сигналов, я пытался получать тег объекта 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?

ответ

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

Hi. Я изменил его на свой путь. Теперь у меня нет ошибок. Но объекты тега также не присваивают объекту активности после создания действия. Чтобы проверить далее, после 'activity.tags.add (* tags)' я добавил эту строку 'activity.verb =" changed ", а затем' activity.save() '. Это меняется. Однако теги не присваиваются activity.tags. Что мне не хватает? – Aamu

+0

Хм, наверное, могут быть и другие ошибки. Я думаю, вам стоит попробовать распечатать теги и проверить, действительно ли они там. Затем вы можете также попытаться добавить их по одному, а не навалом (хотя навалом быстрее). Таким образом, вы бы заменили activity.tags.add (* tags) на «для t в тегах: activity.add (t)» – steffens21

+0

Да. Ты прав. Чтобы убедиться, что я сделал это 'tags = activity.target.tags.all()', а затем 'activity.verb ="% s "% (tags.first())'. Но вместо того, чтобы получить первый тег, глагол, который я получил, был «Нет». – Aamu

0

Вы должны обратить внимание на трассировку, которую вы получаете. Даже если вы не разместили его здесь, было бы ясно, что ошибка возникает при создании Activity, а не при чтении тега из News. Это связано с тем, что вы не можете передавать данные для поля «многие ко многим» при создании экземпляра модели - поскольку объект нужно сохранить, прежде чем вы сможете назначить ему отношения M2M.

Выполните линию tags из вызова get_or_create и назначьте их впоследствии.

+0

Здравствуйте, я вынул назначение тегов из вызова 'get_or_create' и затем назначил. Но даже тогда activity.tags не назначаются. Чтобы проверить далее, после activity.tags.add (* tags) я добавил эту строку, activity.verb = "changed", а затем activity.save(). Это меняется. Однако теги не присваиваются activity.tags. Что мне не хватает? – Aamu