0

いくつかのゾーンを持つユーザー主導のアプリを作成しています。ユーザーがメッセージ設定をカスタマイズできるようにして、関心のある部分やアクションについてのみメールを受信できるようにしたいと考えています。私は以下を作成しましたClass

class EmailSetting(models.Model):
    user = models.ForeignKey(User, related_name="%(class)s_related_user")
    key = models.CharField(max_length=50)
    value = models.BooleanField()

get_users(key, default)これは、ユーザーのリスト返すと呼ばれるメソッドによって使用されます。たとえば、 に登録されているユーザーkey="new_post", default=Falseのリストを要求した場合、そのキーの値が True の EmailSetting を持つユーザーのリストを取得する必要があります。EmailSetting モデルを使用するだけなので、これは非常に簡単です。

デフォルトが True の場合、物事は難しく見えます。モデルを使った基本的なルックアップよりも複雑なことはしたことがないので、手を貸す必要があります。

ユーザーの完全なリストから、False EmailSetting を持つユーザーを削除する必要があります。False エントリを探して EmailSetting で別のクエリを実行し、それらを最初のクエリセットから繰り返し切り取る以外は、これを行う方法がわかりません...

…でも、それは臭いから別の方法があるに違いない。

4

2 に答える 2

1

さて、これが私がやった方法です:

def get_users(key, default):
    if not default:
        return [es.user for es in EmailSetting.objects.filter(key = key, value = True)]
    return User.objects.exclude(pk__in = [es.user.pk for es in EmailSetting.objects.filter(key = key, value = False)])

考えてみれば驚くほどシンプル!時々Python構文が大好きです=)

于 2009-01-15T12:39:44.233 に答える
0

名前に「user」が含まれる EmailSetting を参照したくないと思われるため、ユーザー フィールドの関連する名前を変更しました。

def get_users(key, default):
    if default:
        return User.objects.exclude(emailsetting__key=key, emailsetting__value=False)
    else:
        return User.objects.filter(emailsetting__key=key, emailsetting__value=True)
于 2009-01-15T12:52:24.050 に答える