Django 1.4:prefetch_related与自定义模型管理器和order_by?

时间:2013-09-11 00:50:41

标签: python django django-queryset

这是一个长镜头问题(看起来似乎没有可能来自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中按nameprogress订购目标/里程碑,并且顺序应该是一致的。例如,如果目标按进度排序,则里程碑也应按进度排序。所以,假设我有一个名为ordering的var,其顺序正确,我可以这样做:

GoalParticipant.objects.filter(participant=pid).select_related(
    ).order_by(ordering).prefetch_related('goal__milestones')

这正确地命令目标,但似乎没有任何方法强制里程碑以相同的方式排序。有没有办法做到这一点?

提前感谢您的帮助,如果我能澄清任何事情,请告诉我。

0 个答案:

没有答案