https://www.softel.co.jp/blogs/tech/archives/1877 Pour la requête, je me suis référé ici.
Utilisez ʻextra car les requêtes spéciales ne peuvent pas être effectuées avec
filtre`
def get_ambiguous_queryset(self, queryset, value, columns):
"""
Renvoie un jeu de requêtes pour une recherche floue
:param queryset:
:param value:
:param columns:
:return:
"""
query_text = ''
count = 0
for column in columns:
if query_text != '':
query_text += ' OR '
temp_value = value
if isinstance(value, list):
if len(value) > count:
temp_value = value[count]
else:
temp_value = value[0]
query_text += f"CONVERT({column} USING utf8) COLLATE utf8_unicode_ci LIKE %s"
temp_value = temp_value.replace('%', r'\%%').replace('_', r'\_')
params.append(f'%{temp_value}%')
count += 1
if query_add:
query_text += query_add
return queryset.extra(where=[query_text], params=params)
#Transmettez le jeu de requêtes, la valeur à rechercher et la colonne à rechercher
self.get_ambiguous_queryset(queryset, value, ['name', 'code', 'description'])
#Vous pouvez également transmettre la valeur que vous souhaitez rechercher dans un tableau(Il est lié à la colonne à rechercher)
self.get_ambiguous_queryset(queryset, [value, self.convert_tel(value)], ['name', 'tel'])
#Modèle NG (la boutique n'est pas jointe et une erreur se produit)
self.get_ambiguous_queryset(queryset, value, ['shop.name', 'shop.code'])
#Motif OK (joint si shop est écrit dans le filtre)
self.get_ambiguous_queryset(queryset, value, ['shop.name', 'shop.code']).filter(shop__name__isnull=False)
Même si je sais l'écrire dans une requête, je me demande toujours comment l'écrire dans Django
Recommended Posts