私はユーザーに基本的なFKを持っています、それを所有者と呼びます
class Baz(models.Model):
owner = models.ForeignKeyField(User)
....
....
さて、Bazのクエリセットを使用して、所有者ごとに1つのBazのみを提供するチェーンできるものはありますか?
私はユーザーに基本的なFKを持っています、それを所有者と呼びます
class Baz(models.Model):
owner = models.ForeignKeyField(User)
....
....
さて、Bazのクエリセットを使用して、所有者ごとに1つのBazのみを提供するチェーンできるものはありますか?
問題は、これに相当するものを実行する方法だと思います。
SELECT * FROM myapp_baz GROUP BY owner_id;
これにより、一意のowner_idごとに1行が返されます。
これがトリックを行うように見えます:
qs = Baz.objects.all()
qs.query.group_by = ['owner_id']
# Seems to do the trick
print [item for item in qs]
あなたが本当に探している関数はGROUPBYです。ただし、Djangoは通常、モデルインスタンスを直接出力しないクエリセットの構築をサポートしていません。この状況では、2つのアプローチがあります。
Baz.objects.values('owner').distinct()
これにより、それぞれの個別の所有者がネットになりますが、Bazオブジェクト自体はネットになりません。
Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())
上記は(少なくともMySQLでは)サブクエリを実行し、意図した結果をもたらすはずですが、それを取得するための最も効率的な方法ではありません。
最後に、アグリゲートが追加されたため、一種の「Distinct」および単に「GROUPBY」として機能するカスタムアグリゲートクラスを作成できる場合があります。
これはおそらく最良の解決策ではありません(メモリ外やクエリセットに入れておきたい)が、次のとおりです。
>>> d={}
>>> [d.setdefault(str(a.owner),a) for a in qs ]
>>> d.values()
各所有者の最新のオブジェクトのリストを返します。私は、このソリューションのスケーラビリティーについて、かなりの懸念があります。
編集:これは機能する可能性が高くなります:
CheckIn.objects.extra(where=['checkins_checkin.id = (SELECT MAX(checkins_checkin.id) FROM checkins_checkin temp, auth_user WHERE auth_user.id = temp.id AND temp.user_id = checkins_checkin.user_id)',]).count()