例如,我有以下型号
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
字段,也应该对其进行查询。
我尝试了user
,但它与GenericForeignKey
的配合效果不是很好,因为:
prefetch_related
,我只能ForeignKey
常见的模型。prefetch_related
对象,因为Prefetch()
不支持自定义查询集。答案 0 :(得分:0)
我认为Notification
可以作为您提出的这三个方法的基类(在django model utils中具有公用的user
属性). Using
InheritanceManager`,您可以查询单个(优化程度不高,但仍然如此)查询。
这些类型和ID看起来也像是通用外键候选者。您是否在看谢谢解决方案?