저는 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()
를 작동하지 않는 이유는 무엇입니까? 귀하의 도움은 매우 감사 할 것입니다. 고맙습니다.
내가 여기있는 것 같아. 문제의 설명을 찾을 수있을거야. (http://stackoverflow.com/questions/23795811/django-accessing-manytomany-fields-from-post-save-signal). –
@ SergeyZherevchuk 그게 전부였습니다. 그에 따라 신호를 변경했습니다. 정말 고맙습니다. – Aamu