4

models.py

class ChatMessage(models.Model):
    ip=models.IPAddressField()
    message=models.CharField(max_length=200)

class BlockIp(models.Model):
    ip=models.IPAddressField()

admin.py

class ChatMessageAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ChatMessageAdmin, self).queryset(request)
        #block=BlockIp.objects.all()
        return qs.exclude(ip='1.1.1.1')

ChatMessage クラスの queryset メソッドを書き直しました。私は次のようなものを返そうとしています:

SELECT * FROM chatmessage as v1 JOIN blockip as v2 on v1.ip!=v2.ip

そのため、ユーザーには、blockip エントリにない IP を持つメッセージのみが表示されます

return qs.exclude(ip=BlockIp.objects.all().ip)構文が正しくありません:(

何かアドバイス?

4

1 に答える 1

14

Django には、値をフィルタリングするときに使用できるいくつかの演算子が用意されています。特に、__inオペレーターが必要です。次のようなことができます。

blocked = BlockIp.objects.all().values_list('ip', flat=True)
messages = ChatMessage.objects.exclude(ip__in=blocked)

values_list指定された値 (この場合はipフィールドのみ) をリストとして返します。

于 2013-04-15T23:55:31.043 に答える