LINUX.ORG.RU

Помогите разобраться с python-кодом!

 , , ,


0

2

Всем привет. Народ, подскажите, где в коде изъян(?

Необходимо из таблицы «Заказов» выбрать только попадающие в интервал времени (даты) от date_from до date_to включительно. В таблице заказов поле «date_order» является отбычным varchar и записи в нем имеют формат - dd.mm.yyyy (прмер: 07.05.2014).

def convert(number):
    """
    Конвертирует строку (день или месяц) в число
    """
    if (number[0] == "0"):
        month_num = int(number[1])
    else:
        month_num = int(number)
    return month_num


def unconvert(number):
    """
    Конвертирует число в сторку (день или месяц)
    """
    if len(str(number)) == 1:
        return "0%s" % number
    else:
        return "%s" % number

...
            # Получам данные из POST и разделяем на подстроки по точке.
            date_from = request.POST["date_from"].split(".")
            date_to = request.POST["date_to"].split(".")

            # Выбираем день, месяц и год даты начала и даты конца
            day_from = date_from[0]
            month_from = date_from[1]
            year_from = date_from[2]

            day_to = date_to[0]
            month_to = date_to[1]
            year_to = date_to[2]

            orders_list = []

            if year_from == year_to:

                if month_from == month_to:

                    for i in xrange( convert(day_from), convert(day_to) ):
                        date = "%s.%s.%s" % (unconvert(i), month_from, year_from)

                        try:
                            orders_list.append(Order.objects.get(date_order=date))
                        except:
                            print("not found")

                else:
                    for i in xrange( convert(month_from), convert(month_to)+1 ):

                        for j in xrange( convert(day_from), convert(day_to) ):
                            date = "%s.%s.%s" % (unconvert(j), unconvert(i), year_from)

                            try:
                                orders_list.append(Order.objects.get(date_order=date))
                            except:
                                print("not found")

           ...

Но код не работает в перделах более 1 месяца. Например, я хочу выбрать все заказы, начиная с 19.05.2014 и по 30.07.2014. В результате выбираются только заказы в месяце 05, а заказы в последующих месяцев не выбираюся. В пределах одного месяца все работает OK. В чем может быть косяк?

Заранее спасибо.


Может лучше конвертировать строку в datetime и там уже сравнивать? Посмотри в сторону datetime.datetime.strptime

gnunixon ★★★
()

Не используй varchar для хранения даты. А если не можешь не использовать, то используй функции базы данных для выборки. Кстати, в питоне тоже есть модуль datetime с функциями strptime и strftime, есть сторонний dateutil с парсером дат. На твои функции «конвертации» без слез смотреть невозможно.

provaton ★★★★★
()
Ответ на: комментарий от provaton

На твои функции «конвертации» без слез смотреть невозможно.

Обоснуй, чем они плохи для конвертации даты дня и месяца в формате dd.mm ?

djnoob
() автор топика
Ответ на: комментарий от provaton

За идею использовать парсер дат - спасибо)

djnoob
() автор топика
Ответ на: комментарий от djnoob

Потому что документацию нихера не читаешь и пишешь дегенеративный код. Начни написание кода с чтения документации. Благо ее и на рсском языке предостаточно.

commit ★★
()

Ого, это произведение может стать классикой на соответствующем ресурсе.

anonymous
()
Ответ на: комментарий от djnoob

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

anonymous
()

Пардоньте, господа, я похоже опять газифицировал лужу:

orders_list = Order.objects.filter(date_order__range=[date_from, date_to])

thnx

djnoob
() автор топика
Ответ на: комментарий от djnoob

Однако это работает только в пределах одного месяца(!

Внимательно посмотри на формат даты, попробуй отсортировать их и выбрать диапазон.

anonymous
()
Ответ на: комментарий от djnoob

Почему?

Метод, который «Конвертирует строку (день или месяц) в число» называется «convert» и аргументом принимает СТРОКУ, которая называется «number». Это первое.

if len(str(number)) == 1

Это вообще пушка. Читай про format.

request.POST[«date_from»]

Подобная херня в большинстве случаев должна быть в обработчике формы. Ты ведь используешь джанго-формы, да?

Остальное г. даже комментировать не буду, ибо видно, что документацию ты даже не открывал. Да и мозг не включал. Похоже на переписывание пахапе-лапши 1-в-1 на пузон.

anonymous
()

Всё очень плохо.

Django и python очень хорошо работают с datetime. Переделай сразу поля, будет проще в будущем.

C1nde
()

В таблице заказов поле «date_order» является отбычным varchar

That's your problem.

heilkitty ★★
()

Переписал все аналогичные функции. Удалил много лишнего. Исправил поля для хранения дат - теперь они в джанге не как CharField, а как DateField. А выборка интервала дат вместо 30 строк, как тут некоторые выразились, дегенеритивного кода, теперь занимает всего одну строчку).

djnoob
() автор топика
Ответ на: комментарий от djnoob

Печальнее всего, что ты так и не понял суть проблемы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.