Django queryset excludes values

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') 

I rewrote the queryset method for the ChatMessage class. I am trying to return something like:

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

so that the user sees only messages that have ip, which is not in the block record.

return qs.exclude(ip=BlockIp.objects.all().ip) does not match the syntax: (

Any tips?

+4
source share
1 answer

Django provides some operators that you can use when filtering values. In particular, you need the __in operator. You can do something like this:

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

values_list will return the given values ​​(in this case, only the ip field) as a list.

+9
source

All Articles