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 查询集