设计通知系统数据库的正确方法是什么?

时间:2018-11-30 09:12:38

标签: python django notifications

例如,我有以下型号

class User(models.Model):
    username = ...
    avatar = ...

class Article(models.Model):
    user = models.ForeignKey(User)
    title = ...
    content = ...

class Comment(models.Model):
    user = models.ForeignKey(User)
    # 'Comment' or 'Article'
    target_type = models.CharField()
    target_id = models.IntegerField()
    content = ...

class Like(models.Model):
    user = models.ForeignKey(User)
    # 'Comment' or 'Article'
    target_type = models.CharField()
    target_id = models.IntegerField()

还有Notification

class Notification(models.Model):
    actor = models.ForeignKey(User)
    receiver = models.ForeignKey(User)
    # 'Comment' or 'Like' or '@'
    verb = models.CharField()
    # Where the notification happens
    source_type = models.CharField()
    source_id = models.IntegerField()
    is_read = ...
    time = ...

source_type表示我需要查找哪个表,并且source_id是该id中的object(可能是Comment或{{ 1}}或其他东西

我需要如下序列化Like

notification

问题是:我不知道查询数据库([ { "actor": { "username": "Yriuns", "avatar": null }, "verb": "Comment", "source": { "pk": 542, "user": { "username": "Yriuns", "avatar": null }, "content": "this is a reply", "time": "2018.11.30 02:38", "target": { "pk": 540, "user": { "username": "Someone", "avatar": null }, "content": "this is a comment" } }, "time": "2018-11-30 02:38:08", "is_read": false }, ... ] )以获得MySQL字段的有效方法。

例如,可能有10条通知,其中5条为source,其中3条为Comment,其中2条为Like。到目前为止,我一个接一个地查询它们,这确实很慢。

请注意@有一个source字段,也应该对其进行查询。

  1. 如何加快速度?
  2. 我是否正确设计了数据库?

我尝试了user,但它与GenericForeignKey的配合效果不是很好,因为:

  1. 不同的模型有不同的prefetch_related,我只能ForeignKey常见的模型。
  2. 我无法使用prefetch_related对象,因为Prefetch()不支持自定义查询集。

1 个答案:

答案 0 :(得分:0)

我认为Notification可以作为您提出的这三个方法的基类(在django model utils中具有公用的user属性). Using InheritanceManager`,您可以查询单个(优化程度不高,但仍然如此)查询。

这些类型和ID看起来也像是通用外键候选者。您是否在看谢谢解决方案?