ValueError в / search (url) / поле 'id' ожидало число, но получило 'Junior' - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь сделать запрос в моем приложении, который возвращает мою модель, чтобы я мог использовать ее в своем шаблоне 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>

И мой взгляд, который делает запрос:

search(request):
    if request.method == 'POST':
        ration_age = request.POST['ration_age']
        ration_atrib = request.POST['ration_atrib']
        ration_type = request.POST['ration_type']
        ration_port = request.POST['ration_port']
        ration_classification = request.POST['ration_classification']
        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)
        #aux = Ration.objects.all().filter(ration_age=age).filter(ration_atrib=atrib).filter(ration_type=type).filter(ration_port=port).filter(ration_classification=classification)
        #aux = Ration.objects.all()
        args = {"aux": aux}
        return render(request, "home.html", args)

Печать страницы HTML: Html Page

Полная трассировка:

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

Ответы [ 2 ]

2 голосов
/ 17 января 2020
aux=Ration.objects.filter(ration_age__name=ration_age,..)

Допустим, у вас есть имя в таблице возраста.

2 голосов
/ 17 января 2020

Вы получаете строку в качестве значения для каждого параметра, поэтому ваш фильтр должен быть связан с некоторым атрибутом каждой модели, которую вы хотите фильтровать.

Например, ration_age - это отношение к Ration, поэтому filter(ration_age=ration_age) в этом случае неверно, это должно было быть filter(ration_age__name=ration_age) - где name - это атрибут в модели Age что вы хотите найти. Это также относится и к другим фильтрам.

Чтобы использовать filter(ration_age=ration_age), вам нужно иметь ration_age в качестве экземпляра модели, поэтому в этом случае было бы:

...    
age = Age.objects.get(name=ration_age) # or Age.objects.filter(name=ration_age).first()
aux = Ration.objects.filter(ration_age=age, ...)
...

Но это вызовет дополнительный запрос для каждого get(), поэтому рекомендуется первый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...