这是一个长远的问题(从 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:里程碑的自定义订购
用户实际上可以通过UIname
或progress
UI 中的任何一个对目标/里程碑进行排序,并且排序应该是一致的。例如,如果目标按进度排序,则里程碑也应按进度排序。所以,假设我有一个ordering
以正确顺序调用的 var,我可以这样做:
GoalParticipant.objects.filter(participant=pid).select_related(
).order_by(ordering).prefetch_related('goal__milestones')
这可以正确地对目标进行排序,但似乎没有任何方法可以强制里程碑以相同的方式排序。有没有办法做到这一点?
提前感谢您的帮助,如果我能澄清任何事情,请告诉我。