Python 特定SQL函数的django自定义函数
我目前正在数据库中执行原始查询,因为我使用MySQL函数instr。我想把它翻译成django Func类。Python 特定SQL函数的django自定义函数,python,python-3.x,django,django-queryset,Python,Python 3.x,Django,Django Queryset,我目前正在数据库中执行原始查询,因为我使用MySQL函数instr。我想把它翻译成django Func类。我已经花了几天时间阅读了,但仍然未能成功编写自定义Func。 这是我的数据库 from django.db import models class Car(models.Model): brand = models.CharField("brand name", max_length=50) #then add the __str__ function
我已经花了几天时间阅读了,但仍然未能成功编写自定义Func。
这是我的数据库
from django.db import models
class Car(models.Model):
brand = models.CharField("brand name", max_length=50)
#then add the __str__ function
然后我为这个测试填充数据库
Car.objects.create(brand="mercedes")
Car.objects.create(brand="bmw")
Car.objects.create(brand="audi")
我想检查我的表中是否有东西在我的用户输入中。这就是我当前执行SQL查询的方式
query = Car.objects.raw("SELECT * FROM myAppName_car WHERE instr(%s, brand)>0", ["my audi A3"])
# this return an sql query with one element in this example
我正试图把它转化成这样的东西
from django.db.models import Func
class Instr(Func):
function = 'INSTR'
query = Car.objects.filter(brand=Instr('brand'))
编辑 感谢您的回复,正确答案是
from django.db.models import Value
from django.db.models.functions import StrIndex
query = Car.objects.annotate(pos=StrIndex(Value("my audi A3"), "brand")).filter(pos__gt=0)
您的自定义数据库功能是完全正确的,但您使用的方式是错误的 当您查看原始SQL函数中的用法时,您可以清楚地看到,您需要3个参数才能使筛选正常工作:一个字符串、一个列名和一个阈值(在您的情况下,它始终为零) 如果要在查询中以相同的方式使用此函数,应按以下方式执行:
query = Car.objects.annotate(
position_in_brand=Instr("my audi A3")
).filter(position_in_brand__gt=0)
要使其正常工作,还需要将output\u field=IntegerField()
添加到函数类中,这样Django知道结果将始终是整数
但是。。。您已经错过了两件事,您的函数根本不需要,因为它已经存在于Django as中
第二件事是:通过使用已经存在的django查找,如包含或icontains
,可以获得相同的结果:
query = Car.objects.filter(brand__contains="my audi A3")
您可以在icontains和contains中找到有关查找的更多信息,这些信息不符合我的需要,因为用户输入包含一些数据库条目,而不是其他方向。对于您的响应,首先,icontains不符合我的需要,因为我想检查是否存在somme数据库品牌“bmw”、“audi”或“mercedes”
包含在用户输入中的“我的奥迪A3”
而不是另一个方向。使用包含或icontains也可以实现这一点。您还可以创建自己的查找,该查找将反向工作。