【发布时间】:2016-09-12 17:16:49
【问题描述】:
考虑到 Django 的 example of using a "through" model 指定多对多关系的额外数据,只需将 Membership 模型更改为看起来像
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
order = models.PositiveIntegerField()
class Meta:
ordering = ('order', )
这样存储的额外数据是一个顺序参数,指定Person 在Group 中的顺序。
我的目标是获取给定Group 的查询集,其中首先包含由order 排序的组中的所有Person 实例,然后是由@987654330 排序的剩余Person 实例(不在组中) @。
我可以用两个查询集来做到这一点,比如
# Get all beatles members ordered by the through model
qs1 = beatles.members.all().order_by('membership__order')
# Get the remaining Persons (those not in the beatles) ordered by name
qs2 = Person.objects.exclude(id__in=qs1).order_by('name')
这些查询集似乎确实包含预期的 Person 实例。但是,我需要一个 combined 两者的查询集,而不仅仅是一个列表或一些 itertools “链”对象,因为我想提供它来初始化一个需要查询集实例的表单字段。
我试过了
result_qs = qs1 | qs2
但我发现result_qs 可以包含重复项(即使我认为联合应该删除重复项??为什么会有重复项?有时甚至可能是 qs1 和 qs2 不重叠的情况!! )。
如果我这样做
result_qs = (qs1 | qs2).distinct()
它似乎确实有效,但我怀疑我正在做的事情是否总是有效,并且是实现这一目标的好方法。
注意,对于 Person 实例所属的每个 Group,执行 Person.objects.all().order_by('membership__order') 会导致大量重复的 Person 实例。
【问题讨论】:
-
混合上述组不等于只搜索所有人员? “属于披头士的人”和“不属于披头士的人”?
-
@raratiru 你能给我举个例子来说明你的意思吗?我认为第一个
qs1的顺序会有问题吗? -
我想要的是所有 Person 对象的集合,这样“beatles”组中的对象按其“order”字段排序,而不在 beatles 中的对象按“order”字段排序默认(名称/ID)。