Django Orm Query - 反向列表查找

Django Orm Query - Reverse list lookup

通过 Django ORM 很容易检查项目是否在列表中,例如

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

反方向怎么样。 如果用户有一个字段说出他访问过的郊区列表(逗号分隔列表),我们必须检查他是否没有访问过特定的郊区。

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

从 shell_plus 检索到的数据将是

的这种类型
{'suburb': '965,967,969,972' }

想要获取所有未访问过郊区 100 的用户?

你可以使用contains lookup喜欢

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

如果您使用的是 postgres 数据库,那么我建议您使用 ArrayField 而不是逗号分隔值。

您可以使用 Q objects 来实现。

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

尝试在 in 查找中使用排除

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

如果您的输入是{'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)