1

ユーザーのアカウントにコンテンツを投稿できる電子メール アドレスを追跡する django アプリを作成しています。ユーザーは、好きなようにアドレスをホワイトリストおよびブラックリストに登録できます。

指定されていないアドレスは、メッセージごとに処理するか、デフォルトでホワイトリストまたはブラックリスト (ユーザー指定) にすることができます。

これが私が書いたdjangoモデルです...それは良い方法だと思いますか? または、各ユーザーのプロファイル モデルにホワイトリストとブラックリスト フィールドを追加する必要がありますか?

class knownEmail(models.Model):
    # The user who set this address' permission, NOT
    # the user who the address belongs to...
    relatedUser = models.ManyToManyField(User)
    email = models.EmailField()

class whiteList(knownEmail):
    pass

class blackList(knownEmail):
    pass

次に、次のようなことができます。

def checkPermission(user, emailAddress):
    "Check if 'emailAddress' is allowed to post content to 'user's profile"
    if whiteList.objects.filter(relatedUser=user, email=emailAddress):
        return True
    elif blackList.objects.filter(relatedUser=user, email=emailAddress):
        return False
    else:
        return None

より良い方法はありますか?

4

3 に答える 3

5

両方のリストが 1 つのモデルに含まれるように再構築します。

class PermissionList(models.Model):
    setter = models.ManyToManyField(User)
    email = models.EmailField(unique=True) #don't want conflicting results
    permission = models.BooleanField()

次に、リストは次のようになります。

# whitelist
PermissionList.objects.filter(permission=True)
# blacklist
PermissionList.objects.filter(permission=False)

特定のユーザーをチェックするには、モデルにいくつかの関数を追加するだけです:

class PermissionList(...):
    ...
    @classmethod
    def is_on_whitelist(email):
        return PermissionList.objects.filter(email=email, permission=True).count() > 0

    @classmethod
    def is_on_blacklist(email):
        return PermissionList.objects.filter(email=email, permission=False).count() > 0

    @classmethod
    def has_permission(email):
        if PermissionList.is_on_whitelist(email):
            return True
        if PermissionList.is_on_blacklist(email):
            return False
        return None

すべてを 1 か所にまとめることで、はるかに簡単になり、より少ない作業でより興味深いクエリを作成できます。

于 2009-04-13T22:17:36.913 に答える
3

[クラス名はすべて大文字で始めてください。]

あなたのコードは、クラスの区別をうまく利用していません。

具体的には、クラスに異なる動作はありません。両方のクラスがすべて同じメソッドを持っているため、そもそもこれらが 2 つの異なるクラスである理由が明確ではありません。それらが異なる方法を持っている場合、あなたのソリューションは良いです。

ただし、異なる方法がない場合は、2 つのサブセットのそれぞれにカスタマイズされたマネージャーを提供することを検討することをお勧めします。KnownEmail

class WhiteList( models.Manager ):
    def get_query_set( self ):
        return super( WhiteList, self ).get_query_set().filter( status='W' )

class BlackList( models.Manager )
    def get_query_set( self ):
        return super( BlackList, self ).get_query_set().filter( status='B' )

class KnownEmail( models.Model ):
    relatedUser = models.ForeignKey(User)
    email = models.EmailField()
    status = models.CharField( max_length=1, choices=LIST_CHOICES )
    objects = models.Manager() # default manager shows all lists
    whiteList= WhiteList() # KnownEmail.whiteList.all() is whitelist subset
    blackList= BlackList() # KnownEmail.blackList.all() is blackList subset
于 2009-04-13T15:54:41.903 に答える