简体   繁体   English

Django Orm查询-反向列表查找

[英]Django Orm Query - Reverse list lookup

Its easy to check if item is in a list via Django ORM like 通过Django ORM可以轻松检查项目是否在列表中

User.objects.filter(name__in = ['x', 'y']) User.objects.filter(name__in = ['x','y'])

how about reverse way. 如何反向。 if User has a field say list of suburbs which he vists (A comma separated list) and we have to check if he has not visited a particular suburb . 如果用户有一个要说的郊区列表(用逗号分隔的列表),并且我们必须检查他是否未访问过特定郊区。

class User(models.Model):
    suburb = models.TextField(_('suburbs'),validators=[validate_comma_separated_integer_list], blank=True)

Data when retrieved from shell_plus will be of this sort for 从shell_plus检索时的数据将属于此类

{'suburb': '965,967,969,972' }

Want to get all users who have not visited suburb 100 ? 是否要让所有未访问郊区的用户都100?

You can achieve this by using Q objects . 您可以使用Q对象来实现。

startswith_string = str(suburb) + ","
contains_string = "," + str(suburb) + ","
endswith_string = "," + str(suburb)

users = User.objects.filter(
    Q(suburb__startswith=startswith_string) | Q(suburb__contains=contains_string) | Q(suburb__endswith=endswith_string),
)

You can use contains lookup like 您可以使用contains查找

User.objects.exclude(suburb__contains='100')

If you are using postgres db, then I will suggest you use ArrayField instead of comma seprated values. 如果您使用的是postgres db,那么我建议您使用ArrayField而不是逗号分隔的值。

Try using exclude with in lookup 尝试查找中使用排除

User.objects.exclude(suburb__in=['100'])

If your input is {'suburb': '965,967,969,972'}, 如果您输入的是{'suburb':'965,967,969,972'},

input = {'suburb': '965,967,969,972' }
input_list = input['suburb'].split(',') # Split the string into list
User.objects.exclude(suburb__in=input_list)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM