Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特定SQL函数的django自定义函数_Python_Python 3.x_Django_Django Queryset - Fatal编程技术网

Python 特定SQL函数的django自定义函数

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

我目前正在数据库中执行原始查询,因为我使用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
然后我为这个测试填充数据库

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也可以实现这一点。您还可以创建自己的查找,该查找将反向工作。