考慮Django的example of using a "through" model到許多一對多的關係中指定額外的數據,僅改變Membership
模型看起來像訂購Django的許多一對多通過模型
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
包含由order
有序組中首先Person
實例一個查詢集,接着使殘存的Person
實例(而不是在基團)通過name
排序。
我可以用兩個查詢集做到這一點,像
# 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實例。但是,我需要一個組合的這兩個查詢集,而不僅僅是一個列表或一些itertools「鏈」對象,因爲我想提供這個來初始化一個需要查詢集實例的表單字段。
我試圖
result_qs = qs1 | qs2
但我發現result_qs
可以包含重複(儘管我認爲工會應該刪除重複?爲何會出現重複呢?這有時甚至可以當QS1的情況下和qs2不重疊!!)。
如果我做
result_qs = (qs1 | qs2).distinct()
它似乎工作,但我懷疑,如果我在做什麼總是要工作,是實現這一目標的一個好方法。
請注意,做Person.objects.all().order_by('membership__order')
會導致Person實例所屬的每個Group
都有大量重複的Person
實例。從評論
混合以上羣體是不一樣的所有人只是搜索? 「那些屬於披頭士的人」和「不屬於披頭士的人」? – raratiru
@raratiru你能給我一個你的意思嗎?我認爲第一個'qs1'的順序會是問題嗎? – fpghost
我想要的是所有Person對象的集合,這些集合中的「beatles」按照它們的「order」字段排序,而那些不在beatles中的對象默認排序(name/id)。 – fpghost