Python /search(url)/字段处的值错误';id';应为一个数字,但得到';初级';

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

我试图在我的应用程序中进行一个查询,返回我的模型,以便我可以在html模板中使用它,但我遇到了那个错误。使用用户填写的表单数据进行查询

这是我试图查询的模型:

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我认为迁移工作正常,我对它们进行了更新,以确保问题不在于迁移。