Бекенд на Django, Урок 3: Filters, Search, Ordering

Поделиться
HTML-код
  • Опубликовано: 30 ноя 2024

Комментарии • 163

  • @sayhellotoroy
    @sayhellotoroy Год назад +81

    В новых версиях после фитрации называется filterset_fields = ['price']
    class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
    filterset_fields = ['price']

    • @cristianglodeanu2329
      @cristianglodeanu2329 Год назад +4

      спасибо

    • @Webian
      @Webian Год назад

      А ще треба реєструвати -
      INSTALLED_APPS = [
      ...
      'django_filters',
      ...
      ]

    • @U7116-k7d
      @U7116-k7d Год назад +2

      Дякую

    • @TimBul-jp2jp
      @TimBul-jp2jp Год назад +1

      Спасибо за замечание, долго ломал голову почему, оказывается и документацию на старую версию читал...

    • @workspace1540
      @workspace1540 Год назад +2

      Тоже попался и полдня убил) спасибо))

  • @НиколайАлексапольский

    На нынешних версиях для работы фильтра во view нужно написать filterset_fields = ['price']. В уроке на более ранних версиях было filter_fields = ['price']. В drf docs это написано, но вдруг кому пригодится

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад +2

      Да, это проблема что библиотеки меняются, а видео уже не поправишь

    • @Mr_Green_N
      @Mr_Green_N 2 года назад +3

      Спасибо, человек!!!
      20 минут искал ошибку, почему не работала фильтрация!

    • @НиколайАлексапольский
      @НиколайАлексапольский 2 года назад +2

      @@SeniorPomidorDeveloper Огромное спасибо за отличное видео! то, что из версии к версии что-то меняется - это нормально. Этот курс по беку просто бесценен.

    • @whythattt4076
      @whythattt4076 Год назад

      целую, котик

  • @kirillkruglov1418
    @kirillkruglov1418 4 года назад +14

    Крутейшие уроки! Лучшее объяснение по джанго в русском сегменте ютуба.
    Спасибо большое, автор !

  • @cronosnoname4038
    @cronosnoname4038 4 года назад +12

    Мужик, ты крут и очень хорошо объясняешь. Не забрасывай канал !

  • @AlexeyShilyaev
    @AlexeyShilyaev Год назад

    Давно не было таких эмоций от изучения чего-то нового, как после этой лекции. После настройки поиска, когда выдало книгу Хемингуэя и книгу про него, испытал эстетическое удовольствие. Спасибо за проделанную работу, продолжайте в том же духе.

  • @supreltd
    @supreltd Год назад

    Спасибо! Ваше объяснение + чтение доков = понимание и работающий код.

  • @ИгорьКузнецов-т8р
    @ИгорьКузнецов-т8р 4 года назад +4

    Спасибо за интересные уроки! Очень актуально и познавательно, особенно про тестирование! Хотелось бы побольше таких видео с новыми проектами!

  • @tihon4979
    @tihon4979 4 года назад +5

    Спасибо, синьор помидор! ))) Ты лучший!!!

  • @ne.casimiro
    @ne.casimiro 2 года назад

    Спасибо Варламов, не знал что ты программист.

  • @scrypto
    @scrypto 2 года назад

    Спасибо, уже весь ваш канал пересмотрел, это последний плейлист (

  • @ПавелРодионов-ш6б
    @ПавелРодионов-ш6б 2 года назад

    Спасибо автору, компетентный специалист. А объяснение просто на высоте!

  • @progmain5237
    @progmain5237 2 года назад +1

    Спасибо за уроки, хорошо объясняешь. Очень много новой инфы и это круто! Но нужно больше опыта, сложно запоиинать все и сразу)))

  • @ToxicBugsy
    @ToxicBugsy 2 года назад +1

    Учил пайтон, SQL и прочие штуки, за Джанго боялся браться и буксовал в учебе. Как же я был не прав когда откладывал твои ролики "на потом":(
    Ты лучший!
    Понял что Джанго это не так страшно. Более того, с джанго хочется возиться, это прекрасно)

  • @artem_garyanov
    @artem_garyanov 2 года назад

    Спасибо, что нашли время! Очень приятно Вас слушать

  • @Channel25_25
    @Channel25_25 2 года назад

    Как же вы мне помогли, вы просто не представляете, огромное Вам спасибо!! продолжайте в том же духе

  • @andredru4278
    @andredru4278 Год назад

    Спасибо. Всё так просто выходит, ух.

  • @uvajat
    @uvajat 3 года назад +1

    Спасибо! Очень крутой урок!

  • @АнтонНебожинський
    @АнтонНебожинський 4 года назад +2

    Спасибо, лучший канал!

  • @dizzivoneverec2737
    @dizzivoneverec2737 3 года назад +1

    Пишу комментарий чтобы по быстрей вышли новые ролики))

  • @ДмитрийСергеев-л6г
    @ДмитрийСергеев-л6г 2 года назад +5

    Ребята, если у кого будут мучения с фильтрами, как у меня. Совет: устанавливайте ту же версию django-filter, что и в видео (2.3.0), а не 22.1(которая на сегодня последняя). А также, как и автор, установите формат вывода JSON (почему-то не работает при подключенной статике drf).

    • @eugenebybin6403
      @eugenebybin6403 2 года назад +11

      Можно использовать и последнюю версию, просто необходимо добавить в приложения 'django_filters', а поле для указания полей фильтрации называется 'filterset_fields', а не 'filter_fields'. Все это есть в документации по ссылке из видео - Django REST Framework - Filtering

    • @pretcb
      @pretcb 2 года назад +1

      @@eugenebybin6403 Прочитал твой комментарий уже после всех вышеперечисленных манипуляций:)) как говорится все на своем опыте. Вначале думал, что мой пакет Django-filters встал криво...

  • @sainco3036
    @sainco3036 4 года назад +2

    Спасибо.

  • @gameaction3611
    @gameaction3611 4 года назад +2

    Спасибо!

  • @Gribori
    @Gribori 4 года назад +4

    лайкнул, подписался и всё такое :D

  • @dodokwak
    @dodokwak 4 года назад +1

    отлично. ещё раз спасибо.

  • @workspace1540
    @workspace1540 Год назад

    Это просто пушка. Спасибо

  • @nikitaradionov4393
    @nikitaradionov4393 4 года назад +4

    Senior Pomidor Developer добрый день. Подскажите пожалуйста, как следует поступить в такой ситуации:
    У меня создана модель "Товар", в которой есть FK на другую модель. При сериализации "Товара" в поле, которое ссылается на другую модель, выводит id, а хотелось бы, чтобы выводило поле 'name'.

    • @nikitaradionov4393
      @nikitaradionov4393 4 года назад +1

      Нашёл решения. Их несколько. Наиболее правильным, как я считаю, является дополнительная сериализация вторичного ключа. Пример скидываю.
      class BrandsSerializers(ModelSerializer):
      class Meta:
      model = Brand
      fields = ['name']
      class SmartPhonesSerializer(ModelSerializer):
      brand = BrandsSerializers(read_only=True)
      class Meta:
      model = SmartPhone
      fields = ['id', 'brand', 'name']
      +++++++++++++++++++++++++++++++++++++++++
      На выходе получаем :
      [
      {"id":1,"brand":{"name":"Apple"},"name":"Apple Iphone 8 Plus"},
      {"id":2,"brand":{"name":"Xiaomi"},"name":"Xiaomi A6"},
      {"id":3,"brand":{"name":"Samsung"},"name":"Samsung galaxy A5"}
      ]

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +2

      Да, выглядит правильно .

    • @nikitaradionov4393
      @nikitaradionov4393 4 года назад +1

      @@SeniorPomidorDeveloper спасибо за обратную связь. Материал, который вы выдаёте просто пушка! Спасибо вам!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Вам спасибо!

    • @АлександрЛобанов-щ2п
      @АлександрЛобанов-щ2п 2 года назад

      @@nikitaradionov4393 твой вариант немного неправильный. Да, ты получишь верный результат, однако такой подход неоптимизированный. У тебя вместо одного запроса будет целая серия из-за того, что ты используешь дополнительную сериализацию.В таком случае нужно обьединять таблицы и назначать ОДИН сериализатор

  • @КириллПрогер
    @КириллПрогер 2 года назад

    Великолепно. Спасибо огромное

  • @dodokwak
    @dodokwak 4 года назад +3

    а чем отличается способ admin.site.register(Book) от @admin.register(Book)
    ... class BookAdmin(ModelAdmin)? спасибо.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +7

      Не знаю... скорее всего ничем. Точнее втрой вариант позволяет как-то настраивать и расширять эту модель в админка. Первый вроде такого не может .

  • @a98cb985
    @a98cb985 Год назад

    Очень спасибо!

  • @hellohomies12321
    @hellohomies12321 Год назад

    а сколько лет вы уже изучаете django? курс просто вау, все понятно, не думал что есть такие люди в ру сегменте 🤩

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Лет восемь я на Джанго работаю.
      Спасибо за такой отзыв!

  • @navin2739
    @navin2739 4 года назад +1

    если есть конечно время для ответа, то помоги, пожалуйста, а за видео спасибо.

  • @dodokwak
    @dodokwak 4 года назад

    Поняла, что не особо задумывалась над разницей между filter and search, особенно с применении к конкретным данным.
    Предположим с моей модели есть поле категория с ForeignKey (Category). Тогда, учитывая особенности Фильтрации, наверное можно во viewset-e прописать просто filter_fields = ['category'] , а не ['category_name'],т.к. фронтенд может мне переслать id категории, которую выбрал юзер.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Да, все верно. Фильтр это по одному полю , а поиск по нескольким разным

  • @VitaliiKovalev
    @VitaliiKovalev Год назад

    я еще обратил внимание, что Сеньор вроде как не добавлял в INSTALLED_APPS строку с 'django-filters', как написано в доке, но при этом у него работало)

  • @АртёмДавыдов-ы5э
    @АртёмДавыдов-ы5э 2 года назад

    Добрый вечер а можете показать как сделать профиль пользователя с формой обратной связи чтобы форма отравляла заявку на почту пользователя который зарегистрированный на сайте

  • @devZu9
    @devZu9 2 года назад

    Очень классные уроки. Всё понятно, но есть незакрытые моменты. Вот как искать допустим по полю цены от 500 до 700 ? Ну это же постоянно встречается в фильтрах и такой популярный кейс совершенно не рассмотрен.

  • @qwerty-st9hh
    @qwerty-st9hh 10 месяцев назад

    Вопрос такой, если у меня в моделях есть поле с датой, то можна ли как-то скпинуть это поле, бо каждый раз менять дату в тестах не удобно?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 месяцев назад

      Да, проще всего будет ее заморозить , библиотекой freezegun , через декоратор @freeze_time("2012-01-14")
      Ну или через mock, написать mock.ANY вместо даты , где мы проверяем данные

  • @Ярославв-у4ю
    @Ярославв-у4ю 4 года назад +1

    Присоэдиняюсь к восторженым зрителям. Урок очень класный. Уменя эсть вопрос , не буду долго росказывать что я только росбираюсь в джанго , может мой вопрос будет и очень простой. На 3.44 мин вы написали filter_backends = [DjangoFilterBackend] filter_fields = [‘praice ’] . Для меня несовсем понятен синтаксис. 1. Почиму вы не записали таким способом как в документации по джангонапример Entry.objects.filter(pub_date__year=2006). 2 [DjangoFilterBackend] что означаэт эта часть ? Что работает какойто фильтр а потом что он отфильтровал отправляет в список. И также [‘praice ’]. Это как переменная список куда отправляютса данные отфильтьтрованого списка только както подругому. Я раньше создавал переменную = список, а потом этот список фильтровал а тут акто непонятно. 3Где можна прочитать об этом. 4 ПРОСЬБА когда эсть такие моменты как filter_backends = [DjangoFilterBackend] filter_fields = [‘praice ’] вы о каждой части отдельно расесняйте: это то, от того, для того, потому. Для вас это банальные и монятные вещи а многим интересно и непонятно.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      1. Я записал таким способом , по тому что этот способ максимально гибкий. Через Entity.objects.filter() было бы очень сложно и не удобно настраивать свои фильтры.
      2. В filter_backends определяются классы, которые позволяют фильтровать queryset у этого view. В filter_fields определяются поля, по которым мы создаём возможность фильтровать при помощи DjangoFilterBackend.
      3. Почитать об этом можно в документации DRF, я ее открывал в этом видео. Можно использовать авто-переводчик страницы на русский.
      4. Я стараюсь объяснять подробно, насколько, насколько это возможно в рамках этого видео, сохраняя темп курса. Если рассказывать про устройство каждого класса то урок длился бы два часа , не думаю что это кому-то понравится , там мы написали всего две строчки .

    • @Ярославв-у4ю
      @Ярославв-у4ю 4 года назад +1

      @@SeniorPomidorDeveloper Спасибо за ответ. Буду вникать

  • @dmitry_rt
    @dmitry_rt 3 года назад

    Класс, спасибо!

  • @flekse4260
    @flekse4260 15 дней назад

    Здравствуйте, подскажите пожалуйста, написал тест для сортировки, а он помимо выдуманных данных, которые мы прописывали в setUp, берет и данные из базы данных. Проверил остальные тесты, они тоже берут значения из базы данных. Не понимаю как такое возможно, ведь ниже вы писали: "В тесте проверяется то, что там создается . Так это работает, так задумано"

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  15 дней назад

      Здравствуйте! Это может быть если в настройках в адресе тестовой базы вы написали адрес основной. Или наоборот. По умолчанию такого не должно быть. А тестовая база должна называться как основная + «_test». Как вариант, если что-то перепуталось то можно придумать какой новое название тестовой базы и прописать в конфигурации

    • @flekse4260
      @flekse4260 15 дней назад

      @@SeniorPomidorDeveloper , подскажите пожалуйста, где изменить настройки адреса тестовой базы данных. Пересмотрел последние 3 видео и не нашел где вы настраиваете тестовую базу данных, а дело в том, что я делал все как вы. Единственное отличие: у меня windows и соответственно я дописал
      import django
      import os
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.settings")
      django.setup()

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  15 дней назад

      Да это надо загуглить или у чат гпт лучше спросить. Не помню точно название переменной , где-то внутри DATABASE

    • @flekse4260
      @flekse4260 15 дней назад

      @@SeniorPomidorDeveloper, хорошо, спасибо огромное, буду пробовать!!!

    • @flekse4260
      @flekse4260 14 дней назад

      @@SeniorPomidorDeveloper, в общем и целом, я смог решить данную проблему и оставлю решение здесь, вдруг у кого-то возникнет такая же проблема.
      Вы были правы, по умолчанию тестовая база данных создается сама, и я даже проверил в PgAdmin, она у меня даже создавалась, но не использовалась.
      Я пробовал добавлять поле 'TEST'{'NAME': 'test_book_db', но это не помогло, помогло только создание нового файла 'test_settings.py' в котором прописал:
      from .settings import *
      DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.postgresql_psycopg2',
      'NAME': 'test_books_db',
      'USER': 'books_user',
      'PASSWORD': 'password',
      'HOST': 'localhost',
      'PORT': '',
      }
      }
      а потом добавил ссылку на этот файл в файле test_api.py:
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.test_settings")
      Спасибо вам!!!

  • @ivankrig7285
    @ivankrig7285 4 года назад

    Добрый день. Можно задать вопрос? Почем при использовании filters.SearchFilter и DjangoFilterBackend строки запросе не конкатенируются, а заменяют друг друга. Если использовать поиск то "?search=hdd", а потом использовать фильтр "?min_price=230&max_price=650" то строка запроса фильтров заменяет строку поиска, то есть результат поиска теряется и не фильтруется. Конечно, если руками вписать "?search=hdd&min_price=230&max_price=650", то получаем ожидаемый результат. Как это можно поправить, или оставить так и пусть на клиенте собирает строку запроса как угодно?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Добрый день! Да, конечно клиент должен сам собирать эти параметры в урле, так как ему хочется. Но я не понял в чем проблема собрать такую-же строку в тестах или в браузере или где-то еще..

    • @ivankrig7285
      @ivankrig7285 4 года назад

      @@SeniorPomidorDeveloper да нет. Проблемы нет. Мне показалось подобное поведение ошибкой, вот и спросил. Спасибо большое за ответ.

  • @БорисЯнушко-л8ю
    @БорисЯнушко-л8ю 3 года назад +1

    Привет, спасибо за крутые уроки, но может быть есть ссылка на гитхаб с кодом?

  • @bonifaciy7100
    @bonifaciy7100 3 года назад

    Всем привет!
    Написал фильтр
    class CreatedDateFilter(filters.FilterSet):
    created_date_lte = django_filters.DateTimeFilter(field_name="created_date", lookup_expr='lte')
    class Meta:
    model = Catalog
    fields = ['id', 'name', 'version', 'short_name', 'description', 'created_date']
    почему при выводе запроса
    /?created_date_lte=2021-07-06/
    в браузере выводиться:
    {"created_date_lte":["Введите правильную дату и время."]}

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +1

      Похоже что формат даты должен быть другой , возможно со временем тоже, так как это DateTime

  • @yawneed
    @yawneed 4 года назад

    Например сортировка по имени автора.( book 1 = author 1, book 2 =author 5, book 3 = author 2)
    def test_get_ordering(self):
    url = reverse('book-list')
    response = self.client.get(url, data={'ordering': 'author_name'})
    serializer_data = BooksSerializer([self.book_1, self.book_3,
    self.book_2], many=True).data
    self.assertEqual(status.HTTP_200_OK, response.status_code)
    self.assertEqual(serializer_data, response.data)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +2

      Супер !

    • @yawneed
      @yawneed 4 года назад

      @@SeniorPomidorDeveloper А скажите пожалуйста, вы работаете на должности senior python bakckend developer?)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Да. )

    • @yawneed
      @yawneed 4 года назад

      @@SeniorPomidorDeveloper а сколько лет в разработке?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Работаю программистом лет уже 5, начал программировать лет 10 назад.

  • @bandirom
    @bandirom 4 года назад +3

    Интересно объясняешь, мне нравится, но я не пойму зачем останавливать сервер, чтобы зайти в shell? Можно же создать ещё одну вкладку консоли) и git bash была б лучше вместо обычной в пай чарме)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +3

      Да, что-то не думал об этом . Я обычно инструментами пользуюсь только встроенными в PyCharm PE, но так как здесь вынужден использовать бесплатную версию , то работаю немного непривычно для себя , по этому получается иногда не оптимально..

  • @ibrahimoglu
    @ibrahimoglu 3 года назад

    👍

  • @elsafarov4724
    @elsafarov4724 16 дней назад

    26:50 мешает голова, напишите пожалуйста запрос

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  16 дней назад

      Это путь до файла. Потом имя класса, потом имя функции. Все пишется через точку.

  • @jimlabable
    @jimlabable 3 года назад

    Я сделал проверку сортировки по полю price, но есть одна проблемка и не знаю как ее решить. Дело в том, что если набор цен (23,45,4) то сортировка будет неверной, потому что функция фильтрует строки. Есть ли возможность фильтровать числа в response? Код такой: def test_get_filter(self):
    response = self.client.get(self.url, data={'ordering': 'price'})
    serializer_data = BooksSerializer([self.book_3, self.book_2, self.book_1], many=True).data
    serializer_data = sorted(serializer_data, key=lambda x: x['price'])
    self.assertEqual(serializer_data, response.data)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      Честно говоря, сейчас нет возможности разбираться с вашим кодом. Может кто из подписчиков поможет …

    • @jimlabable
      @jimlabable 3 года назад

      @@SeniorPomidorDeveloper Спасибо за ответ! Ошибся в принтах, это моя функция сортировала строки (serializer_data) Это легко поправимо. serializer_data = sorted(serializer_data, key=lambda x: float(x['price']))

  • @antonsachuk615
    @antonsachuk615 3 года назад

    response = self.client.get(url, data={'ordering': 'price'})
    Подскажи пожалуйста - мы ставили в браузерной строке - перед прайсом, чтобы отсортировалось по убыванию. А как сделать это в тестах? ставлю 'ordering': '-price' и 'ordering': -'price' выдаёт ошибку

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +1

      Знак минус конечно должен быть внутри кавычек. По ошибке не знаю что подсказать, смотря какая там ошибка , они очень разные бывают

    • @maesthrow
      @maesthrow 2 года назад +1

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

  • @Name-ko3qb
    @Name-ko3qb Год назад

    Для чего нужны поиск и сортировка в ресте?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Чтобы искать и сортировать) На сайте , к примеру. Рест это то, что стоит за визуальной оболочкой сайта.

    • @Name-ko3qb
      @Name-ko3qb Год назад

      @@SeniorPomidorDeveloper Спсибо бро, так и подумал)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      😁

  • @bonifaciy7100
    @bonifaciy7100 3 года назад

    Всем привет!
    Как отфильтровать данные???
    использую django-filters
    Нужно:
    получение списка справочников, актуальных на указанную дату.
    Например:
    есть справочники
    1.05.21
    10.05.21
    20.05.21
    Как сделать что бы вводилась дата и выводились справочники созданные ранее этой даты??

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +1

      Надо что-то такое django-filter.readthedocs.io/en/stable/ref/filters.html#isodatetimefilter
      create_date = IsoDateTimeFilter(field_name='created', lookup_expr='lte')

    • @bonifaciy7100
      @bonifaciy7100 3 года назад

      ​@@SeniorPomidorDeveloper Спасибо!

  • @rsyuzyov
    @rsyuzyov 3 года назад

    На 11:50 мы сделали вывод в админке id и названия для Book, но получилось не совсем красиво - просто строка с id и name. А как сделать, чтобы вывод был в виде таблицы из трех колонок: id, name и price? Или это где-то дальше будет?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      Не очень понял что на 11:50. Вообще это курс чисто про API, про отображение тут ничего не будет, мы это все оставляем воображаемому фронтендеру .

    • @shaxdjuraev
      @shaxdjuraev Год назад +1

      Ещё можно фильтровать (по категориям там и т.д.) list_filter=('category') только сначала нужно создать модель категории=)) и классная штука в админке save_on_top=True

    • @shaxdjuraev
      @shaxdjuraev Год назад +2

      В классе BookAdmin():
      list_display=('id', 'name', 'price')
      list_display_links=('id', 'name')

  • @СергейХохлов-ю4д
    @СергейХохлов-ю4д 3 года назад

    Вопрос? Делаю поиск с помощью кириллицы. И регистронезависимость не работает! ( По умолчанию стоит регистронезависимый поиск! Но он тока работает для латиницы. То есть он различает букву "п" и букву "П" а хотелось бы что бы не различал. Подскажите как сделать?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      Честно говоря , не знаю , надо гуглить типа «case insensitive search utf-8”

    • @СергейХохлов-ю4д
      @СергейХохлов-ю4д 3 года назад

      @@SeniorPomidorDeveloper ага чот перерыл все не могу найти. Ну это из-за того что в url буквы преобразуются типа в такие %D0%9F . Ок ну спасибо) если появится ответ - пиши. А я буду дальше гуглить!

    • @felixfreedman
      @felixfreedman 3 года назад

      @@СергейХохлов-ю4д вы нашли ответ?

  • @ruslanizz
    @ruslanizz 4 года назад

    Что считается правильным - сортировать и фильтровать на стороне сервера (силами Джанго), или во фронтенде (JS, vue.js)? Объём БД не очень большой, 5 тысяч объектов. Такое ощущение что на стороне клиента будет быстрее, не нужно обращаться к БД.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +2

      Только на сервере . База данных всегда имеет свойство расти . И не нужно будет нагружать сеть лишними данными

  • @НикитаЗарецкий
    @НикитаЗарецкий 4 года назад

    вопрос немного не по теме видео, но при изменении css файла django не отображает эти изменения на сайте, что делать?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Пересобрать через команду collectstatic? Не очень знаю, на самом деле

    • @dodokwak
      @dodokwak 4 года назад +1

      попробуйте в браузере работать инкогнито, у него кэш очищается.

    • @dmytrokovalov2199
      @dmytrokovalov2199 4 года назад +3

      Когда сделал изменения в CSS и идешь в браузер смотреть результат, то для обновления страницы используй Ctrl + F5. Это Hard Refresh. Чистит кеш страницы.

  • @Name-ko3qb
    @Name-ko3qb Год назад

    А почему мы не проверяем книги из БД, а лишь созданные внутри теста?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      В тесте проверяется то, что там создается . Так это работает, так задумано

    • @Name-ko3qb
      @Name-ko3qb Год назад

      @@SeniorPomidorDeveloper Спасибо что отвечаешь)

    • @Name-ko3qb
      @Name-ko3qb Год назад

      @@nicholasspezza9449 А вот грубить мне не стоило бы, если только вам нарвится выглядить идиотом.

  • @vasyapupkin007
    @vasyapupkin007 4 года назад

    Это всё хорошо и познавательно. Но как быть в случае если надо разработать API, который должен выдавать данные из некой legacy database, в которой нет primary/foreign keys от слова совсем? Как я понял, django ORM не позволит даже raw-sql выполнить. Или я неправ? У меня не получилось. Более-менее это удалось с применением sqlalchemy и Flask.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Ну для того чтобы делать raw-sql не нужен ORM, он нужен как раз чтобы их не делать.
      Если у вас серьезное веб-приложение, то я бы рекомендовал промигрировать базу в какой-то нормальный вид, а потом спокойно использовать ORM, такой какой нравится .

    • @vasyapupkin007
      @vasyapupkin007 4 года назад

      @@SeniorPomidorDeveloper Об этом я в курсе. Мигрировать или менять бд возможности нет. Если не нужен django ORM, то зачем нужен django? :) Выводить json через DRF? Но это можно сделать и без django.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Все можно сделать без всего. Вопрос удобства и скорости разработки стандартного функционала.

    • @vasyapupkin007
      @vasyapupkin007 4 года назад

      @@SeniorPomidorDeveloper Согласен. Но вопрос был не об этом :) Вопрос был такой: правильно ли я понял, что при использовании django ORM не получится использовать legacy database, в которой нет prinary/foreign keys, а возможности что-то изменить в бд нет? Ранее я разрабатывал API на Flask и sqlachemy, решил в этот раз попробовать Django DRF. И в итоге не удалось реализовать задачу. Гугление вокруг этой темы пока ничего не дало. Думаю вернуться к варианту на Flask. И второй вопрос: Не планируете сделать аналогичный мини-курс по Flask ? Спасибо.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Не могу ответить на вопрос , может и получится с этой базой , тут от базы зависит, надо пробовать. Гугл тут не поможет , в любом случае это какие-то хаки и «танцы с бубном» придётся исполнять. По фласку курс не планирую делать , там и функционала то мало у него.

  • @RuchejAlex
    @RuchejAlex 3 года назад

    как отфильтровать по месяцу и году игнорируя день?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      Типа двойной фильтр . gte=01-08-2021 , lt=01-09-2021

    • @RuchejAlex
      @RuchejAlex 3 года назад

      @@SeniorPomidorDeveloper у вьюшки api прописано поле для фильтра дата. Как указать в параметрах урла фильтр по году и месяцу? это в связки DRF

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      Думаю что так не получится

  • @navin2739
    @navin2739 4 года назад

    что использовать для работы с координатами ?
    есть тестовое задание и я его завалил, но для меня вопрос остается открытым.
    нужно было создать компонент, который бы позволил получал адрес доставки и возвращал данные зоны доставки и курьера, который привязан к этой зоне. Сложность заключалась в том, что я вообще понятия не имею как организовать сохранения координат самой зоны доставки так, чтобы при получении адреса доставки происходила проверка на принадлежность данной точки (адреса доставки) к зоне доставки. Зона должна сохраняться в виде набора координат

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Сложное задание. Тут нужно скорее всего использовать PostGIS и искать примеры как на нем такие штуки делаются..

    • @navin2739
      @navin2739 4 года назад

      @@SeniorPomidorDeveloper спасибо тебе!)

  • @montecristo31
    @montecristo31 Год назад

    у вас есть телеграм беседа?

  • @devopsliveuz
    @devopsliveuz 2 года назад

    исходники?

  • @ЮрийКлименко-к3щ
    @ЮрийКлименко-к3щ 2 года назад

    но ведь есть же принцип, что нужно тестировать только свой код, зачем же писать тесты на фильтры, поиск и сортировку DRF? мы все равно под капот этих классов не залазим

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

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

  • @aleksei_bauman
    @aleksei_bauman 9 месяцев назад

    сражался с тестами для сортировки, в итоге вышло так:
    def test_ordering(self):
    """Проверка сортировки"""
    url = reverse('book-list')
    response = self.client.get(url, data={'ordering': '-title'})
    serializer_data = BookSerializer([self.book3, self.book2, self.book1], many=True)
    serializer_data_sort = sorted(serializer_data.to_representation(serializer_data.data), key=itemgetter('title'))
    self.assertEqual(serializer_data_sort, response.data)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  9 месяцев назад +1

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

  • @jamjam3337
    @jamjam3337 9 месяцев назад

    спасибо!👍

  • @МишаМихаил-ф7х
    @МишаМихаил-ф7х 2 года назад

    Супер, спасибо!