4

模型.py

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

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

管理员.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 类的查询集方法。我试图返回类似的东西:

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 回答