2

私はユーザーに基本的なFKを持っています、それを所有者と呼びます

class Baz(models.Model):

    owner = models.ForeignKeyField(User)


    ....
    ....

さて、Bazのクエリセットを使用して、所有者ごとに1つのBazのみを提供するチェーンできるものはありますか?

4

4 に答える 4

3

問題は、これに相当するものを実行する方法だと思います。

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]
于 2009-08-23T00:45:05.670 に答える
2

あなたが本当に探している関数はGROUPBYです。ただし、Djangoは通常、モデルインスタンスを直接出力しないクエリセットの構築をサポートしていません。この状況では、2つのアプローチがあります。

Baz.objects.values('owner').distinct()

これにより、それぞれの個別の所有者がネットになりますが、Bazオブジェクト自体はネットになりません。

Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())

上記は(少なくともMySQLでは)サブクエリを実行し、意図した結果をもたらすはずですが、それを取得するための最も効率的な方法ではありません。

最後に、アグリゲートが追加されたため、一種の「Distinct」および単に「GROUPBY」として機能するカスタムアグリゲートクラスを作成できる場合があります。

于 2009-08-23T00:21:38.383 に答える
1

これはおそらく最良の解決策ではありません(メモリ外やクエリセットに入れておきたい)が、次のとおりです。

>>> d={}
>>> [d.setdefault(str(a.owner),a) for a in qs ]
>>> d.values()

各所有者の最新のオブジェクトのリストを返します。私は、このソリューションのスケーラビリティーについて、かなりの懸念があります。

于 2009-08-23T15:36:07.607 に答える
0

編集:これは機能する可能性が高くなります:

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() 
于 2009-08-22T18:40:17.407 に答える