【发布时间】:2016-06-24 16:02:30
【问题描述】:
我有一个标签模型、一个新闻模型和一个活动模型。一个新闻对象可以有很多标签。一个活动对象也可以有很多标签。
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 Signals 创建新的新闻对象时,我都会创建一个新的活动对象。
@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()
news 对象的创建没有任何问题,它具有所有填充的值(包括标签)。活动对象也被创建,没有任何问题。但是,新闻对象的标签没有被初始化到活动对象中。甚至activity.verb 的值也是None,它应该给我一个新闻对象标签之一的标签名称。
即使这样也行不通
tags = kwargs.get('instance').tags.all()
我在这里缺少什么?您的帮助将不胜感激。谢谢。
【问题讨论】:
-
我猜here 你会找到问题的解释。
-
@SergeyZherevchuk 就是这样。我相应地改变了信号。非常感谢。
标签: django django-models django-signals