使用 Django GenericForeignKey 存储基本通知
Use Django GenericForeignKey to store basic notifications
我经常使用 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
...
现在,对于一个用户的每个操作,另一个相关用户都会收到通知。我已经通过使用节点服务器和 socket.io 完成了这些的实时方面。但是,为了让目前不在线的用户实现同样的行为,我遇到了上面提到的通用外键和 ContentTypes。
我的问题是,由于文档对此不太清楚,我想知道如何使用这两个功能来存储用户活动?
我实际上是新手,但我以前用过一点,所以我只是分享我使用 GenericForeignKey 的经验。
基本上你想在模型中定义内容类型和 id 字段,然后是第三个字段来组合它们,以便你以后可以轻松地查找它,如下所示:
class UserActivity(models.Model):
activity_ct = models.ForeignKey(ContentType)
activity_id = models.PositiveIntegerField()
activity = generic.GenericForeignKey('activity_ct', 'activity_id')
当你 save/query 时,你会这样做:
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 对象时,你可以直接 activity_obj.activity
。我不确定这是否正是您的计划,但机制是相同的。希望这有帮助。
我经常使用 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
...
现在,对于一个用户的每个操作,另一个相关用户都会收到通知。我已经通过使用节点服务器和 socket.io 完成了这些的实时方面。但是,为了让目前不在线的用户实现同样的行为,我遇到了上面提到的通用外键和 ContentTypes。
我的问题是,由于文档对此不太清楚,我想知道如何使用这两个功能来存储用户活动?
我实际上是新手,但我以前用过一点,所以我只是分享我使用 GenericForeignKey 的经验。
基本上你想在模型中定义内容类型和 id 字段,然后是第三个字段来组合它们,以便你以后可以轻松地查找它,如下所示:
class UserActivity(models.Model):
activity_ct = models.ForeignKey(ContentType)
activity_id = models.PositiveIntegerField()
activity = generic.GenericForeignKey('activity_ct', 'activity_id')
当你 save/query 时,你会这样做:
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 对象时,你可以直接 activity_obj.activity
。我不确定这是否正是您的计划,但机制是相同的。希望这有帮助。