2016-06-24 2 views
0

저는 Tag 모델, News 모델 및 Activity 모델이 있습니다. 뉴스 객체는 많은 태그를 가질 수 있습니다. 또한 활동 객체에는 많은 태그가있을 수 있습니다.Signal을 사용하여 다른 객체를 생성 할 때 인스턴스의 필드 값이 없음

class Tag(models.Model): 
    name = models.CharField(max_length=20, unique=True) 

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() 
    actor = GenericForeignKey('actor_type', 'actor_id') 
    verb = models.CharField(max_length=10) 
    target_type = models.ForeignKey(ContentType, related_name='target_type_activities') 
    target_id = models.PositiveIntegerField() 
    target = GenericForeignKey('target_type', 'target_id') 
    tags = models.ManyToManyField(Tag) 

이제 django 신호를 사용하여 새 뉴스 개체를 만들 때마다 새로운 활동 개체가 생성됩니다.

@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 
     if target_type.name == 'news': 
      verb = 'published an article' 
     else: 
      verb = '-verb-' 
     activity, created = Activity.objects.get_or_create(
      actor_type=actor_type, 
      actor_id=actor_id, 
      verb=verb, 
      target_type=target_type, 
      target_id=target_id 
     ) 
     tags = activity.target.tags.all() 
     activity.tags.add(*tags) 
     activity.verb = "%s" % (tags.first()) 
     activity.save() 

뉴스 개체는 아무런 문제없이 생성되며 모든 값 (태그 포함)이 채워져 있습니다. 활동 오브젝트도 아무 문제없이 작성됩니다. 그러나 뉴스 개체의 태그는 활동 개체로 초기화되지 않습니다. activity.verb의 값도 None이며, 대신 뉴스 객체의 태그 중 하나에 태그 이름을 지정해야합니다.

에도이 내가 여기 실종 무엇

tags = kwargs.get('instance').tags.all() 

를 작동하지 않는 이유는 무엇입니까? 귀하의 도움은 매우 감사 할 것입니다. 고맙습니다.

+0

내가 여기있는 것 같아. 문제의 설명을 찾을 수있을거야. (http://stackoverflow.com/questions/23795811/django-accessing-manytomany-fields-from-post-save-signal). –

+0

@ SergeyZherevchuk 그게 전부였습니다. 그에 따라 신호를 변경했습니다. 정말 고맙습니다. – Aamu

답변

0

그래서 Sergey의 매우 유용한 설명을 통해 News 개체의 태그를 Activity 개체에 추가 할 수있었습니다.

post_save 신호를 m2m_changed 신호로 변경했습니다. 또한 if kwargs.get('created', False')if action=='post_add'으로 변경했습니다.

@receiver(m2m_changed, sender=News.tags.through) 
def add_tags_to_activity(sender, action, instance, **kwargs): 
    if action == 'post_add': 
     actor_type = ContentType.objects.get_for_model(instance.user) 
     actor_id = instance.user.id 
     target_type = ContentType.objects.get_for_model(instance) 
     target_id = instance.id 
     pub_date = instance.pub_date 
     if target_type.name == 'news': 
      verb = 'published an article' 
     else: 
      verb = '-verb-' 
     activity, created = 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() 

어쩌면 나 같은 다른 사용자에게 도움이 될 것입니다.