• Как правильно спроектировать обработку ошибок в слоях?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Я предпочитаю делать это следующим образом.
    На уровне репозитория (FooRepository) получаю Optional<Foo>. Далее на сервисном уровне (FooServiceImpl), который дублирует метод репозитория получаю уже Foo или в случае его отсутствия выбрасываю кастомное исключение FooNotFoundException. Затем некий глобальный ControllerAdvice ловит это исключение и возвращает http статус 404 с кастомным текстом Foo Not Found.
    Ответ написан
    Комментировать
  • В каком виде хранить данные о товарах в бд?

    @alexalexes
    В таблице param задавайте тип данных этого параметра, а таблице product_param весь набор полей данных, который нужен будет для описания любого параметра. Могут быть не только типы, стандартные для БД, но и по предметной области (интервалы, габариты и тд).
    param (id, type_data /*тип данных параметра или размерность (лучше размерность вынести еще одним свойством)*/, name)
    product_param (product_id, param_id,
    value_int -- целое
    value_int2 -- целое для типов интервалов целых (с value_int по value_int2 )
    value_str -- строка
    value_date -- дата
    value_date2 -- дата для типов интервалов дат (с value_date по value_date2)
    )
    Ответ написан
    Комментировать
  • Как можно организовать архитектуру модуля древовидного меню?

    sarapinit
    @sarapinit
    Точу водой камень
    Паттерн проектирования Состояние(State) предназначен для этих целей. https://refactoring.guru/ru/design-patterns/state
    Ответ написан
    Комментировать
  • Как сгруппировать результат, если уже есть одна группировка?

    longclaps
    @longclaps
    SELECT
      item_id,
      COUNT(*) AS cnt
    FROM (SELECT DISTINCT *
          FROM item_user) AS T
    GROUP BY item_id;

    или еще проще:
    SELECT
      item_id,
      COUNT(DISTINCT user_id) AS cnt
    FROM item_user
    GROUP BY item_id;
    Ответ написан
    Комментировать
  • Как можно отфильтровать список в админке для ForeignKey?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Переопределить ModelAdmin.formfield_for_foreignkey:
    class NewsAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "category":
                kwargs["queryset"] = Category.objects.filter(some_parameter=some_value)
            return super(NewsAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    Хотя, я предпочитаю лимитировать возможные значения ForeignKey в модели.
    Ответ написан
    1 комментарий
  • Правильный подход к организации структуры фраз i18n в django?

    anton_lazarev
    @anton_lazarev
    Данный вопрос уже давно обсуждается сообществом, но к единому варианту так никто и не пришел, так что все используют вариант на свой вкус. Лично я использую второй вариант.

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

    Минусы:
    - если необходимо поменять оригинальный текст, то придется искать по всему проекту использование этого ключа и менять его, хотя в первом варианте достаточно было бы поменять только в .po файле
    Ответ написан
    Комментировать
  • Как поменять формат скриншотов?

    defaults write com.apple.screencapture type jpg;killall SystemUIServer
    Ответ написан
    3 комментария
  • Как загрузить файл в django с кириллическим названием?

    возможно это не самый разумный способ, но для быстрого решения подойдет.
    Смысл в переписывании родных-джанговских upload handlor'ов
    в settings.py
    FILE_UPLOAD_HANDLERS = (
        'название_аппликейшена.uploadhandler.MemoryFileUploadHandler',
        'название_аппликейшена.uploadhandler.TemporaryFileUploadHandler',
    )

    И соответственно uploadhandler.py
    from io import BytesIO
    import os
    from django.core.files.uploadedfile import TemporaryUploadedFile, InMemoryUploadedFile
    from django.core.files.uploadhandler import FileUploadHandler, StopFutureHandlers
    from django.conf import settings
    import pytils
    import re
    
    
    def translify(value):
        value = pytils.translit.translify(u"%s" % value)
        value = re.sub("[\W]", "_", value.strip())
        return value
    
    
    def transliteration_file_name(file_name):
        name, ext = os.path.splitext(file_name)
        return '{0}{1}'.format(translify(name), ext)
    
    
    class TemporaryFileUploadHandler(FileUploadHandler):
        """
        Upload handler that streams data into a temporary file.
        """
    
        def __init__(self, *args, **kwargs):
            super(TemporaryFileUploadHandler, self).__init__(*args, **kwargs)
    
        def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None):
            file_name = transliteration_file_name(file_name)
            super(TemporaryFileUploadHandler, self).new_file(field_name, file_name, content_type,
                                                             content_length, charset, content_type_extra)
            self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset, self.content_type_extra)
    
        def receive_data_chunk(self, raw_data, start):
            self.file.write(raw_data)
    
        def file_complete(self, file_size):
            self.file.seek(0)
            self.file.size = file_size
            return self.file
    
    
    class MemoryFileUploadHandler(FileUploadHandler):
        """
        File upload handler to stream uploads into memory (used for small files).
        """
    
        def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None):
            """
            Use the content_length to signal whether or not this handler should be in use.
            """
            # Check the content-length header to see if we should
            # If the post is too large, we cannot use the Memory handler.
            if content_length > settings.FILE_UPLOAD_MAX_MEMORY_SIZE:
                self.activated = False
            else:
                self.activated = True
    
        def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None):
            file_name = transliteration_file_name(file_name)
            super(MemoryFileUploadHandler, self).new_file(field_name, file_name, content_type,
                                                          content_length, charset, content_type_extra)
            if self.activated:
                self.file = BytesIO()
                raise StopFutureHandlers()
    
        def receive_data_chunk(self, raw_data, start):
            """
            Add the data to the BytesIO file.
            """
            if self.activated:
                self.file.write(raw_data)
            else:
                return raw_data
    
        def file_complete(self, file_size):
            """
            Return a file object if we're activated.
            """
            if not self.activated:
                return
    
            self.file.seek(0)
            return InMemoryUploadedFile(
                file=self.file,
                field_name=self.field_name,
                name=self.file_name,
                content_type=self.content_type,
                size=file_size,
                charset=self.charset,
                content_type_extra=self.content_type_extra
            )
    Ответ написан
    Комментировать
  • Как загрузить файл в django с кириллическим названием?

    Lertmind
    @Lertmind
    Проблема вероятно не с Django. Если погуглите, то у кого-то проблема с Nginx stackoverflow.com/a/7602446
    Здесь ещё вопрос stackoverflow.com/questions/2457087/unicodedecodee..., в комментарии под ответом указывается, что надо правильно Apache настраивать https://code.djangoproject.com/ticket/11030#comment:5
    Так что укажите на чём вы запускали: ОС и сервер.
    UPD: Здесь itekblog.com/ascii-codec-cant-encode-characters-in... подробные варианты ошибок и решений.
    Ответ написан
    Комментировать
  • Как отсортировать по полю DateTimeField, но только по дате (django)?

    petermzg
    @petermzg
    Самый лучший программист
    Foo.objects.extra(select={'d_field': 'date(<field name>)'}).extra(order_by=['d_field'])
    Ответ написан
    5 комментариев