1
最簡單的例子:如何從多對多場排序查詢集的註釋ATTR
class User(models.Model):
name = ...
class Group(models.Model):
members = models.ManyToManyField(User, through='GroupMembership')
class GroupMembership(models.Model):
user = ...
group = ...
我想通過成員的註釋字段排序組的列表。
我正在使用trigram搜索來過濾和註釋用戶queryset。 若要註釋的用戶我有類似的東西:
User.objects.annotate(...).annotate(similarity=...)
現在我想通過用戶的‘相似性’排序組查詢集:
ann_users = User.objects.annotate(...).annotate(similarity=...)
qs = Group.objects.prefetch_related(Prefetch('members',
queryset=ann_users))
qs.annotate(similarity=Max('members__similarity')).order_by('similarity')
但它不工作,因爲prefetch_related
在Python中執行「連接」;所以我有錯誤:
"FieldError: Cannot resolve keyword 'members' into field."
感謝您的回答。我有你的想法。不幸的是,我沒有單一的功能「相似性」;我的搜索更復雜 - 它使用Double Metaphone + Trigrams搜索幾個字段。 –
另一件事:我猜這個相似性不應該被使用兩次,不是嗎? –
如果您編寫相似性表達式,我可以將其重寫爲一個函數。註釋不能被相關字段重用(或者我不能)。關係是模型不是查詢或查詢集。因此目前無法通過相關字段重複使用註釋。檢查相似性評估的數量是否爲len(User)+ len(GroupMembership)或2 * len(User)對於您的後端更重要。比手寫SQL慢兩倍的ORM並不差。 – hynekcer