Python /search(url)/字段处的值错误';id';应为一个数字,但得到';初级';
我试图在我的应用程序中进行一个查询,返回我的模型,以便我可以在html模板中使用它,但我遇到了那个错误。使用用户填写的表单数据进行查询 这是我试图查询的模型:Python /search(url)/字段处的值错误';id';应为一个数字,但得到';初级';,python,django,Python,Django,我试图在我的应用程序中进行一个查询,返回我的模型,以便我可以在html模板中使用它,但我遇到了那个错误。使用用户填写的表单数据进行查询 这是我试图查询的模型: class Ration(models.Model): ration_name = models.CharField(max_length=255) ration_desc = models.TextField() ration_age = models.ManyToManyField(Age) ratio
class Ration(models.Model):
ration_name = models.CharField(max_length=255)
ration_desc = models.TextField()
ration_age = models.ManyToManyField(Age)
ration_image = models.CharField(max_length=2083)
ration_atrib = models.ManyToManyField(Attributes)
ration_type = models.ManyToManyField(Type)
ration_port = models.ManyToManyField(Port)
ration_classification = models.ManyToManyField(Classification)
ration_price = models.FloatField()
def __str__(self):
return self.ration_name
表格:
<form method="post" class="form-signin" action="{% url 'search' %}">
{% csrf_token %}
<select class="form-control" id="ration_age" name="ration_age">
<option value="Junior">Junior</option>
<option value="Adulto">Adulto</option>
<option value="Senior">Senior</option>
</select>
<select class="form-control" id="ration_atrib" name="ration_atrib">
{% for atribs in atribs %}
<option value={{ atribs.attributes_name }}>{{ atribs.attributes_name}}</option>
{% endfor %}
</select>
<select class="form-control" id="ration_type" name="ration_type">
<option value="Cão">Cão</option>
<option value="Gato">Gato</option>
</select>
<select class="form-control" id="ration_port" name="ration_port">
<option value="Pequeno">Pequeno</option>
<option value="Médio">Médio</option>
<option value="Grande">Grande</option>
</select>
<select class="form-control" id="ration_classification" name="ration_classification">
<option value="Económica">Económica</option>
<option value="Standart">Standart</option>
<option value="Premium">Premium</option>
</select>
<button class="btn btn-lg btn-primary btn-block" type="submit">Pesquisar</button>
</form>
HTML页面的打印:
完全回溯:
C:\Users\mcpri\Documents\GitHub\ProjetoPIS\PyRacoes>manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
January 16, 2020 - 22:52:57
Django version 3.0, using settings 'pyracoes.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[16/Jan/2020 22:52:58] "GET / HTTP/1.1" 200 2139
[16/Jan/2020 22:53:00] "GET /home/ HTTP/1.1" 200 3857
[16/Jan/2020 23:14:12] "GET / HTTP/1.1" 200 2139
[16/Jan/2020 23:14:13] "GET /home/ HTTP/1.1" 200 3857
Internal Server Error: /search/
Traceback (most recent call last):
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\__init__.py", line 1768, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'Junior'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "D:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "D:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "D:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\mcpri\Documents\GitHub\ProjetoPIS\PyRacoes\pyracoes_main\views.py", line 63, in search
aux = Ration.objects.all().filter(ration_age=ration_age, ration_atrib=ration_atrib, ration_type=ration_type, ration_port=ration_port, ration_classification=ration_classification)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\sql\query.py", line 1337, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\sql\query.py", line 1362, in _add_q
child_clause, needed_inner = self.build_filter(
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\sql\query.py", line 1298, in build_filter
condition = self.build_lookup(lookups, col, value)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\sql\query.py", line 1155, in build_lookup
lookup = lookup_class(lhs, rhs)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\lookups.py", line 22, in __init__
self.rhs = self.get_prep_lookup()
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\related_lookups.py", line 115, in get_prep_lookup
self.rhs = target_field.get_prep_value(self.rhs)
File "D:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\__init__.py", line 1770, in get_prep_value
raise e.__class__(
ValueError: Field 'id' expected a number but got 'Junior'.
[16/Jan/2020 23:14:14] "POST /search/ HTTP/1.1" 500 118204
您将收到一个字符串作为每个参数的值,因此您的筛选器应该与要筛选的每个模型的某些属性相关 例如,
ratio\u age
是ratio
上的关系,因此filter(ratio\u age=ratio\u age)
在这种情况下是错误的,应该是filter(ratio\u age\u name=ratio\u age)
-其中name
是要搜索的模型age
中的属性。这也适用于其他过滤器
要使用filter(ratio\u age=ratio\u age)
,您需要将ratio\u age
作为模型实例,因此在本例中,应该是:
...
age = Age.objects.get(name=ration_age) # or Age.objects.filter(name=ration_age).first()
aux = Ration.objects.filter(ration_age=age, ...)
...
但是这将触发对每个
get()
的额外查询,因此建议使用第一个选项。您将收到一个字符串作为每个参数的值,因此您的筛选器应该与要筛选的每个模型的某个属性相关
aux=Ration.objects.filter(ration_age__name=ration_age,..)
例如,ratio\u age
是ratio
上的关系,因此filter(ratio\u age=ratio\u age)
在这种情况下是错误的,应该是filter(ratio\u age\u name=ratio\u age)
-其中name
是要搜索的模型age
中的属性。这也适用于其他过滤器
要使用filter(ratio\u age=ratio\u age)
,您需要将ratio\u age
作为模型实例,因此在本例中,应该是:
...
age = Age.objects.get(name=ration_age) # or Age.objects.filter(name=ration_age).first()
aux = Ration.objects.filter(ration_age=age, ...)
...
但是这会为每个get()
触发一个额外的查询,因此建议使用第一个选项
aux=Ration.objects.filter(ration_age__name=ration_age,..)
假设你的名字在年龄表中
假设你的名字在年龄表中 您能提供完整的回溯吗?@NKSM更新了问题以获得完整的回溯,谢谢you@NKSM我认为迁移工作正常,我对它们进行了更新,以确保迁移没有问题。您能提供完整的回溯吗?@NKSM更新了问题以获得完整的回溯,感谢you@NKSM我认为迁移工作正常,我对它们进行了更新,以确保问题不在于迁移。