ユーザーのステータスからユーザーのアクティビティストリームを作成しようとしています。
モデル:
class Status(models.Model):
body = models.TextField(max_length=200)
image = models.ImageField(blank=True, null=True, upload_to=get_upload_file_name)
privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
user = models.ForeignKey(User)
class Activity(models.Model):
actor = models.ForeignKey(User)
action = models.CharField(max_length=100)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
ただし、新しいステータスを作成しても、post_save
シグナル。
信号:
from Django.contrib.contenttypes.models import ContentType
from Django.db.models.signals import post_save
from status.models import Status
from models import Activity
def create_activity_item(sender, instance, signal, *args, **kwargs):
if kwargs.get('created', True):
ctype = ContentType.objects.get_for_model(instance)
if ctype.name == 'Status':
action = ' shared '
activity = Activity.objects.get_or_create(
actor = instance.user,
action = action,
content_type = ctype,
object_id = instance.id,
pub_date = instance.pubdate
)
post_save.connect(create_activity_item, sender=Status)
私は何を間違えていますか?この問題の解決を手伝ってください。とても感謝しています。ありがとうございました。
更新:
ただし、このようにするとアクティビティが作成されます。
@receiver(post_save, sender=Status)
def create(sender, instance, **kwargs):
if kwargs.get('created',True):
ctype = ContentType.objects.get_for_model(instance)
activity = Activity.objects.get_or_create(
actor = instance.user,
action = ' shared ',
content_type = ctype,
object_id = instance.id,
pub_date = instance.pub_date
)
なぜ上記はうまくいかないのですか?
_post_save.connect
_が実行されていないようです。 signals
のどこかにインポートする必要があります。 Django 1.7の場合、アプリのconfig ready()関数でこれを行うことをお勧めします。ドキュメントの "Where should this code?" side noteをお読みください。
たとえば、アプリの名前がactivity
の場合:
activity/__ init __。py
_default_app_config = 'activity.apps.ActivityAppConfig'
_
activity/apps.py
_from Django.apps import AppConfig
class ActivityAppConfig(AppConfig):
name = 'activity'
def ready(self):
import activity.signals
_
connect()
呼び出しに dispatch_uid を追加することを忘れないでください:
_post_save.connect(create_activity_item, sender=Status,
dispatch_uid="create_activity_item")
_
[〜#〜] update [〜#〜]:name
のContentType
属性は常に小文字です。したがって、if
ステートメントを次のように変更する必要があります。
_if ctype.name == 'status':
_
触れることなくapps.pyこれは私のために働いた。
class MyModel(models.Model):
""" MyModel fields go """
body = models.TextField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
def post_save_actions(sender, instance, created, **kwargs):
if created:
pass
# post save actions if new instance is created,
# do something with `instance` or another models
# be careful about circular imports. \m/
信号フック
post_save.connect(post_save_user_actions, sender=MyModel)