Представление класса Django - ошибка MultipleObjectsReturned

Я думаю, что varchar (20) требует только 21 байт, а varchar (500) требует всего 501 байт. Таким образом, суммарные байты 522, меньше 767. Итак, почему я получил сообщение об ошибке?

UTF8 требует 3 байта на символ для хранения строки, поэтому в вашем случае 20 + 500 символов = 20 * 3 + 500 * 3 = 1560 байт, что более чем допустимо 767 байт.

Предел для UTF8 составляет 767/3 = 255 символов, для UTF8mb4, который использует 4 байта на символ, это 767 / 4 = 191 символ.


Для этой проблемы существует два решения, если вам нужно использовать более длинный столбец, чем предел:

  1. Используйте «более дешевую» кодировку ( один, который требует меньше байтов на символ). В моем случае мне нужно было добавить уникальный индекс в столбец, содержащий строку SEO-статьи, поскольку я использую только [A-z0-9\-] символов для SEO, я использовал latin1_general_ci, который использует только один байт на символ и поэтому столбец может иметь длину 767 байт.
  2. Создайте хэш из своего столбца и используйте уникальный индекс только для этого. Другим вариантом для меня было создание еще одного столбца, в котором будет храниться хэш SEO, в этом столбце будет UNIQUE ключ, чтобы гарантировать, что значения SEO уникальны , Я бы также добавил индекс KEY к исходной колонке SEO, чтобы ускорить поиск.
1
задан Giranyx Pornasdoro 20 March 2019 в 20:27
поделиться

1 ответ

Причина, по которой вы получаете эту ошибку, заключается в том, что вы используете get_object_or_404, чтобы получить одну книгу, но проблема в том, что ваш запрос возвращает несколько книг. Обычно это происходит, когда нет уникального ограничения на поле, которое вы используете для поиска книги (т.е. получение объекта по заголовку «Книга джунглей» возвращает две книги с одинаковым названием).

Чтобы исправить это, получите объект, используя поле, которое гарантированно будет уникальным, например, id . Например:

urls.py

path('page-details/<str:book_id>/<str:page_id>/', PageDetailView.as_view(), name='page_details'),

views.py

class PageDetailView(LoginRequiredMixin, generic.View):
    def get(self, request, *args, **kwargs):
        book = get_object_or_404(id=kwargs['book_id'])
        page = get_object_or_404(id=kwargs['page_id'])
        [...]
0
ответ дан Hybrid 20 March 2019 в 20:27
поделиться