2

这是一个长远的问题(从 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)

从这里,我的页面控制器获得一个GoalParticipantId 值(例如,称为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:里程碑的自定义订购

用户实际上可以通过UInameprogressUI 中的任何一个对目标/里程碑进行排序,并且排序应该是一致的。例如,如果目标按进度排序,则里程碑也应按进度排序。所以,假设我有一个ordering以正确顺序调用的 var,我可以这样做:

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

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

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

4

0 回答 0