这是一个长镜头问题(看起来似乎没有可能来自Django文档,但我想我只是想问一下是否有人有任何想法)。注意:我正在使用Django 1.4。
我想在prefetch_related()查询中使用自定义模型管理器。然后,最重要的是,我想以某种方式订购预取的结果。
要将其放入简化代码中,我有以下模型(注意:Participant
模型从代码中排除,因为它无关紧要):
class GoalParticipant(models.Model):
"""Many-to-many model between Goal and Participant models."""
participant = models.ForeignKey(
'Participant', related_name='goal_participants')
goal = models.ForeignKey('Goal', related_name='goal_participants')
active = models.BooleanField(default=True)
class Goal(models.Model):
name = models.CharField(max_length=50)
progress = models.IntegerField()
active = models.BooleanField(default=True)
class Milestone(models.Model):
name = models.CharField(max_length=50)
progress = models.IntegerField()
goal = models.ForeignKey('Goal', related_name='milestones')
active = models.BooleanField(default=True)
从此处,我的页面控制器获得GoalParticipant
Id值(称为pid
)。我想显示该ID的所有目标和里程碑。
所以这样的事情会正常工作:
GoalParticipant.objects.filter(participant=pid).select_related(
).prefetch_related('goal__milestones')
以下是两个皱纹:
1:自定义模型管理器
我的所有课程都有自定义模型管理器,如下所示:
objects = ActiveManager()
all_objects = models.Manager()
ActiveManager
在查询集上运行.filter(active=True)
。这是为了方便起见,因此我可以在默认情况下轻松地说出.objects
并抛出有效过滤器。但有时候,我需要显示所有对象,而不仅仅是活动对象。所以我尝试了这个:
GoalParticipant.all_objects.filter(participant=pid).select_related(
).prefetch_related('goal__milestones')
这给了我所有的目标参与者和所有目标,但仍然只限制活跃的里程碑。有没有办法强制prefetch_related
使用all_objects
模型管理器?
2:里程碑的自定义排序
用户实际上可以在UI中按name
或progress
订购目标/里程碑,并且顺序应该是一致的。例如,如果目标按进度排序,则里程碑也应按进度排序。所以,假设我有一个名为ordering
的var,其顺序正确,我可以这样做:
GoalParticipant.objects.filter(participant=pid).select_related(
).order_by(ordering).prefetch_related('goal__milestones')
这正确地命令目标,但似乎没有任何方法强制里程碑以相同的方式排序。有没有办法做到这一点?
提前感谢您的帮助,如果我能澄清任何事情,请告诉我。