2016-06-22 2 views
0

저는 활동 모델을 가지고 있습니다. 활동 모델은 News 개체가 생성 될 때마다 활동 개체를 만듭니다. 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.tver.add (* tags)'다음에'activity.verb = "changed"를 추가하고'activity.save()'를 추가했다. 이것은 변화하고 있습니다. 그러나 태그는 activity.tags에 지정되지 않습니다. 내가 뭘 놓치고 있니? – Aamu

+0

흠, 다른 버그가있을 수 있습니다. 나는 당신이 태그를 인쇄 해보고 그것들이 실제로 있는지 확인해야한다고 생각한다. 그런 다음 일괄 적으로 대신 하나씩 추가 할 수도 있습니다 (대량은 더 빠름). 따라서 activity.tags.add (* tags)를 "for t tags : activity.add (t)"로 대체하십시오. – steffens21

+0

예. 당신 말이 맞아요. 나는 이것을'tags = activity.target.tags.all()'그리고 나서'activity.verb = "% s"% (tags.first())'로했다. 하지만 첫 번째 태그를 얻는 대신에, 내가 얻은 동사는 '없음'입니다. – Aamu

0

점점 커지는 추적에주의해야합니다. 아직 게시하지 않았더라도 News에서 태그를 읽을 때가 아니라 Activity를 만들 때 오류가 발생한다는 것이 분명합니다. 이는 모델을 인스턴스화 할 때 다 대다 필드에 대한 데이터를 전달할 수 없기 때문입니다. 객체를 저장해야만 M2M 관계를 할당 할 수 있기 때문입니다.

tags 행을 get_or_create 통화에서 빼내어 나중에 할당해야합니다.

+0

안녕하세요, 나는'get_or_create' 호출에서 태그 할당을 꺼내서 할당했습니다. 그러나 그때도 activity.tags는 지정되지 않습니다. 더 확인하려면 activity.tags.add (* tags) 다음에이 줄을 추가 한 후 activity.verb = "changed"와 activity.save()를 차례로 추가했습니다. 이것은 변화하고 있습니다. 그러나 태그는 activity.tags에 지정되지 않습니다. 내가 뭘 놓치고 있니? – Aamu