【问题标题】:Django queryset exclude valuesDjango 查询集排除值
【发布时间】: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) 语法不正确:(

有什么建议吗?

【问题讨论】:

    标签: django django-admin django-queryset


    【解决方案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:我没有运行查询,但是是的,您可能需要稍微调整一下。让我更新。
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2019-08-14
    • 2014-04-11
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多