使用Django GenericForeignKey存储基本通知

时间:2015-10-14 08:54:31

标签: django django-contenttypes generic-foreign-key

我已经使用了很多Django,而且我对模型非常熟悉。但是,我刚刚遇到了GenericForeignKey和ContentTypes框架。

我计划使用这些来存储引用其他一些模型的基本通知。

例如,我有以下模型

class UserFollowers(models.Model): #Model to store which user follows others
    ...

class ContactShared(models.Model): #Model to store contact requests between users
    ...

现在,在一个用户的每个操作上,其他相关用户都会收到通知。我已经使用Node服务器和socket.io完成了这些方面的实时方面。但是,为了对目前不在线的用户实现同样的行为,我遇到了上面提到的通用外键和内容类型。

我的问题是,由于文档对此不太清楚,我想知道如何使用这两个功能来存储用户活动?

1 个答案:

答案 0 :(得分:1)

我实际上是新手,但我之前使用了一点,所以我只是与GenericForeignKey分享我的经验。

基本上你想要在模型中定义内容类型和id字段,然后是第三个字段来组合它们以便以后可以轻松查找,如下所示:

class UserActivity(models.Model):
    activity_ct = models.ForeignKey(ContentType)
    activity_id = models.PositiveIntegerField()
    activity = generic.GenericForeignKey('activity_ct', 'activity_id')

保存/查询时,执行以下操作:

from django.contrib.contenttypes.models import ContentType

activity_obj = UserFollowers.objects.get(id=1)
activity_ct = ContentType.objects.get_for_model(activity_obj)
activity_create = UserActivity.objects.create(activity_ct=activity_ct, 
                                              activity_id=activity_obj.id)
activity_query = UserActivity.objects.filter(activity_ct=activity_ct,
                                             activity_id=activity_obj.id)

好的部分是,当您想要提取UserActivity的活动对象时,您可以activity_obj.activity。我不确定它是不是你的计划,但机制是一样的。希望这会有所帮助。