按目前的状态类型筛选项目时的状态是一个ManyToManyField

对于后台看到这太问题:返回当前项目的状态(即在Django的多对多关系最近的日期)

当我在思考这个问题,它激发了我自己的问题。 从本质上讲,你有大致类似下面的内容:

class StatusType(models.Model): name = models.CharField(max_length=64) class Project(models.Model): status = models.ManyToManyField(StatusType, through='ProjectStatusType') class ProjectStatusType(models.Model): project = models.ForeignKey(Project) status_type = models.ForeignKey(StatusType) created = models.DateTimeField(auto_now_add=True)

要获取某个特定项目的当前状态的类型,你可以这样做:

Project.status.order_by('-projectstatustype__created')[0]

但是,如果你想获得其当前状态为'富'的所有项目?

Project.objects.filter(status__name='foo')

这将返回谁过'富'的状态,它是否是当前状态的项目。 你几乎要像做(注意使用current在过滤器):

Project.objects.annotate(current=Max('projectstatustype__created')).filter(status__name='foo', projectstatustype__created=current)

很显然,这是行不通的,因为在这种情况下, current预期是当前范围内的Python变量,但它让我疑惑:是有一些方法来传递,虽然是同一个概念到SQL,这样它会寻找符合刚创建的注释创建的日期?

更新:

它是由@akonsu建议简单地使用ProjectStatusType模式,来代替。 然而,这并不真正解决任何问题。

ProjectStatusType.objects.filter(statustype__name='foo')

返回所有ProjectStatusType与'富'的状态。 然后你可以在查询集循环,并获得每个Projectproject属性,但同样,这些都将是项目的,在某个时间点上有这样的状态,并不一定是目前这个状态的项目。 即使你想是这样:

ProjectStatusType.objects.filter(statustype__name='foo').order_by('-created')[0]

然后访问project属性,只会给你最近收到此状态,而不是目前的状态都为所有项目的项目。

--------------解决方案-------------

主要问题是如何通过比较两个其字段来过滤查询设置:https://docs.djangoproject.com/en/dev/topics/db/queries/#filters-can-reference-fields-on-the-模型。

因此使用注释原始查询可以固定:

Project.objects.annotate(current=Max('projectstatustype__created'))
.filter(status__‌​name='foo',
projectstatustype__created=F('current'))

可能有多个连接和聚合工作的解决方案,但我想非规范化:只需添加cur_status领域的Project ,并与信号更新。

分类:Django的 时间:2015-03-15 人气:3
本文关键词: Django的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.455 (s). 10 q(s)