Django 查询集排除值

Posted

技术标签:

【中文标题】Django 查询集排除值【英文标题】:Django queryset exclude values 【发布时间】:2013-04-08 05:41:20 【问题描述】:

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 类的查询集方法。 我正在尝试返回类似的内容:

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

所以用户只能看到 IP 不在 blockip 条目中的消息

return qs.exclude(ip=BlockIp.objects.all().ip) 语法不正确:(

有什么建议吗?

【问题讨论】:

【参考方案1】:

Django 提供了一些可以在过滤值时使用的运算符。特别是,您需要 __in 运算符。你可以这样做:

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

values_list 将返回给定值(在本例中,只是 ip 字段)作为列表。

【讨论】:

ip__in 这就是我所缺少的 我想知道为什么 BlockIp.objects.all() 就足够了。如果 BlockIp 模型中的字段 ip 有不同的名称,在上述查询中是否有任何更改? @ChrisPappas:我没有运行查询,但是是的,您可能需要稍微调整一下。让我更新。

以上是关于Django 查询集排除值的主要内容,如果未能解决你的问题,请参考以下文章

构建请求 URL 以通过同一字段多次过滤 Django 查询集

Django 查询集过滤器文件字段不为空

Django - UpdateView ModelForm 在查询集字段上设置初始值

过滤 Django 查询集以获取 dict 值

如何使用 Django ORM 排除列的多个值?

Django - 按 CharField 值长度过滤查询集