Как увеличить год в поле datetime в Django с помощью update ()? - PullRequest
2 голосов
/ 04 ноября 2010

Есть ли способ увеличить год для отфильтрованных объектов с помощью метода update ()?

Я использую:

python 2.6.5
django 1.2.1 final
mysql  Ver 14.14 Distrib 5.1.41

Я знаю, что можно сделать что-то вроде этого:

today = datetime.datetime.today()
for event in Event.objects.filter(end_date__lt=today).iterator():
    event.start_date = festival.start_date + datetime.timedelta(365)
    event.end_date = festival.end_date + datetime.timedelta(365)
    event.save()

Однако в некоторых случаях я бы предпочел использовать метод update ().

# This does not work..

Event.objects.all().update(
            start_date=F('start_date') + datetime.timedelta(365),
            end_date=F('end_date') + datetime.timedelta(365)
            )

В приведенном выше примере я получаю:

Warning: Truncated incorrect DOUBLE value: '365 0:0:0'

SQL-запрос, который он пытается сделать:

UPDATE `events_event` SET `start_date` = `events_event`.`start_date` + 365 days, 0:00:00, `end_date` = `events_event`.`end_date` + 365 days, 0:00:00

Я нашел кое-что в руководстве по mysql, но это неформатированный sql!

SELECT DATE_ADD('2008-12-15', INTERVAL 1 YEAR);

Есть идеи?

Ответы [ 4 ]

1 голос
/ 15 мая 2012

Одна потенциальная причина "Предупреждение: данные, усеченные для столбца X" исключение - это использование не целых значений дня для временной шкалы, добавляемой к DateField - это нормальнов Python, но не удается при записи в MySQL DB.Если у вас есть DateTimeField , он тоже работает, поскольку точность сохраненного поля соответствует точности временной шкалы.

Т.е.:

>>> from django.db.models import F
>>> from datetime import timedelta
>>> from myapp.models import MyModel
>>> [field for field in MyModel._meta.fields if field.name == 'valid_until'][0]
<django.db.models.fields.DateField object at 0x3d72fd0>
>>> [field for field in MyModel._meta.fields if field.name == 'timestamp'][0]
<django.db.models.fields.DateTimeField object at 0x43756d0>
>>> MyModel.objects.filter(pk=1).update(valid_until=F('valid_until') + timedelta(days=3))
1L
>>> MyModel.objects.filter(pk=1).update(valid_until=F('valid_until') + timedelta(days=3.5))
Traceback (most recent call last):
...
Warning: Data truncated for column 'valid_until' at row 1
>>> MyModel.objects.filter(pk=1).update(timestamp=F('timestamp') + timedelta(days=3.5))
1L
0 голосов
/ 04 ноября 2010
from dateutil.relativedelta import relativedelta

yourdate = datetime.datetime(2010, 11, 4, 10, 14, 54, 518749)
yourdate += relativedelta(years=+1)

Relativedelta принимает много временных аргументов, от секунд до лет ...

0 голосов
/ 04 ноября 2010

Вы видели это: Увеличение поля даты и времени с queryset.update ? Я также помню, как успешно использовал queryset .update () с timedelta с бэкэндом MySQL.

0 голосов
/ 04 ноября 2010

Быстро, но безобразно:

>>> a.created.timetuple()
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=2, tm_hour=2, tm_min=35, tm_se
c=14, tm_wday=3, tm_yday=307, tm_isdst=-1)
>>> time = list(a.created.timetuple())
>>> time[0] = time[0] + 1
>>> time
[2001, 11, 2, 2, 35, 14, 3, 307, -1]
>>>
...