12

ユーザーデータに対してメトリクスを実行していて、「@example.com」や「@test.com」などの偽のメールを送信しているユーザーを除外したいと考えています。

私は試した

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
Users.objects.exclude(email__endswith__in=emails_to_exclude)

残念ながら、これは機能しません。見た目は似endswithinいて、お互いにうまく遊んでいません。何か案は?

4

6 に答える 6

31

QuerySet は lazyであるため、単純に QuerySet をループします。

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
users = Users.objects
for exclude_email in emails_to_exclude:
    users = users.exclude(email__endswith=exclude_email)
users = users.all()
于 2012-05-26T19:39:12.790 に答える
2

単一のクエリで正規表現を使用してこれを行うこともできます。

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
User.objects.exclude(email__regex = "|".join(emails_to_exclude))

このクエリの効率はわかりません。

正規表現のサポートが組み込まれていないため、これはSQLiteでは機能しません。

于 2012-05-29T07:07:01.687 に答える
1

おそらく、電子メールをループしてQオブジェクトを作成することができます。実際、賢い人ならおそらく1ライナーを使うことができます。

User.objects.exclude(bitwise_or_function[Q(email__endswith=e) for e in emails_to_exclude])

そんな感じ。私はビット単位の関数を覚えていません-またはリスト全体を一緒に、私のPythonはさびています。

于 2012-05-26T19:28:30.330 に答える
0

除外入力を変更しsetて、「@」を付けないようにしました。そうでなければ、これはあなたが望むことをするはずです。

>>> emails = ['foo@example.com', 'spam@stackoverflow.com', 'bad@test.com']
>>> excludes = {'example.com', 'test.com', 'mailinator.com'}
>>> [email for email in emails if email.split('@')[-1] not in excludes]
['spam@stackoverflow.com']
于 2012-05-26T19:33:30.817 に答える