web-dev-qa-db-ja.com

フィールドごとにクエリセットの個別の値を取得する

私はこのモデルを持っています:

class Visit(models.Model):
    timestamp  = models.DateTimeField(editable=False)
    ip_address = models.IPAddressField(editable=False)

ユーザーが1日に複数回アクセスする場合、ipフィールドに基づいて一意の行をフィルタリングするにはどうすればよいですか?(I今日のユニークな訪問が必要です)

today = datetime.datetime.today()
yesterday = datetime.datetime.today() - datetime.timedelta(days=1)

visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something?

編集:

私が使用できることがわかります:

Visit.objects.filter(timestamp__range=(yesterday, today)).values('ip_address')

iPフィールドのみのValuesQuerySetを取得します。これで、QuerySetは次のようになります。

[{'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address':
 u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}]

QuerySetを評価せずにdbヒットを取得せずに、一意性についてこれをフィルタリングするにはどうすればよいですか?

# Hope it's something like this...
values.distinct().count()
46
Scott

あなたが欲しいのは:

Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk"))

これは、すべてのip_addressesを取得してから、各IPアドレスのプライマリキーの数(行の数)を取得します。

38
Alex Gaynor

Alex Answerでは、各アイテムのn:1もあります。 distinct()句があっても。

これはかなりの数のアイテムを返しているので奇妙です:

Visit.objects.filter(stuff).values("ip_address").distinct().count()

しかし、「Visit.objects.filter(stuff).values( "ip_address")。distinct()」を繰り返すと、さらに多くのアイテムといくつかの重複がありました...

編集:

フィルター句は私にトラブルを引き起こしていました。私は別のテーブルフィールドでフィルタリングしていましたが、SQL JOINが作成されました。このヒントを使用して、実際に使用されたクエリを確認しました。

q=Visit.objects.filter(myothertable__field=x).values("ip_address").distinct().count()
print q.query

その後、クエリとフィルターを作成していた「魔女」のクラスを元に戻し、「訪問」IDに依存しない結合を作成しました。

お役に立てれば

17