Django 1.4:预取与自定义模型管理器相关联的u和order?

2024-05-16 11:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个遥不可及的问题(从Django文档来看似乎不可能,但我想问一下只是想看看有没有人有什么想法)。注意:我使用的是django1.4。在

我想对预取相关()查询使用自定义模型管理器。然后,除此之外,我想以某种方式对预取的结果进行排序。在

为了简化代码,我有以下模型(注意: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)

从这里,我的页面控制器获得一个GoalParticipantId值(称为pid)。我想显示该ID的所有目标和里程碑

所以像这样的东西会正常工作:

^{pr2}$

以下是两条皱纹:

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或{}来对目标/里程碑进行排序,并且排序应该是一致的。例如,如果目标按进度排序,则里程碑也应按进度排序。所以,假设我有一个名为ordering的变量,顺序正确,我可以这样做:

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

这对目标进行了正确的排序,但似乎没有任何方法可以强制里程碑以相同的方式排序。有办法吗?在

提前感谢你的帮助,如果我能澄清什么就告诉我。在


Tags: name模型true目标管理器objects排序models