【发布时间】:2016-11-30 11:22:52
【问题描述】:
我一直在努力尝试使用 Django ORM 进行此查询,我到处搜索但找不到答案。 这是我的模型。
class Decision(models.Model):
ACTION_CHOICES = [('include', _('Include')), ('exclude', _('Exclude'))]
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
date_taken = models.DateTimeField(_('date taken'), default=timezone.now)
action = models.CharField(max_length=7, choices=ACTION_CHOICES)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
project = models.ForeignKey('projects.Project', on_delete=models.CASCADE)
is_permanent = models.BooleanField(_('is permanent'), default=False)
我要查询的是用户在项目中所做的每个 content_object 的最新永久决策,因为此查询在应用程序中被重复调用,通过像 Decision.filter(user_id=user.pk, project_id=project.pk) 这样更简单的 QuerySet 进行迭代以获得最终结果这不是一个选择。到目前为止,我使用像这样的 RawQuerySet 解决了它。
Decision.objects.raw("SELECT decision.id, decision.content_type_id, decision.object_id "
"FROM canvasblocks_decision AS decision "
"WHERE decision.date_taken = (SELECT max(last_decision.date_taken) "
" FROM canvasblocks_decision AS last_decision "
" WHERE last_decision.object_id = decision.object_id AND "
" last_decision.content_type_id = decision.content_type_id AND "
" last_decision.project_id = %s AND decision.user_id = %s) ",
[project.pk, user.pk])
但是我不喜欢这个解决方案,因为我失去了所有 Django ORM 的能力,而且我必须再次过滤这个查询来检查操作,失去这个能力是很痛苦的,因为我必须在一个子查询上使用所有随之而来的复杂性。小伙伴们,你们知道更好的方法吗?顺便说一句,我使用的是 Django 1.9.4。提前致谢。
【问题讨论】:
标签: python sql django-queryset