如何将Django的TimeField转换为Postgres的timestamp

2024-09-27 22:11:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Django应用程序中,程序从用户那里获取事件的时间,比如说用户输入10:30作为事件时间。该程序使用modelformset_factory创建一大堆表单:

#forms.py
class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ['entry', 'time', 'work']
        localized_fields = ('time', )
        widgets = {
        'work': Textarea(attrs = {'cols': 40, 'rows': 8}),
        }

#models.py
class Event(models.Model):
    '''
    Each day there are many events, e.g. at 10 am, the framer orders material, etc.
    '''
    entry = models.ForeignKey(Entry)
    time = models.TimeField()
    work = models.TextField()


#views.py:

EventFormSet = modelformset_factory( Event, form = EventForm, exclude = ('entry',),extra = 5)

eventset = self.EventFormSet(request.POST)

all_errors = eventset.errors # All errors returns [{}, {}, {}, {}, {}], so the data is free of error.
try:
    eventset.is_valid()             
except ValidationError:
    return render(request, self.template_name, {'form': self.day_log(initial = self.initial_values), 'eventforms': self.event_formset})
events_instances = eventset.save(commit = False)

for instance in events_instances:
    if instance.time:
        event_date = datetime.date(the_year, the_month, the_day) # Naive date
        event_time = instance.time # Naive time
        naive_event_time = timezone.is_naive(event_time) # Checking naivaty 
        event_datetime = datetime.datetime.combine(event_date, event_time) # Naive datetime object
        is_aware_event_datetime = timezone.is_aware(event_datetime) # Checking to see if the datetime object is aware or naive
        event_aware_datetime = datetime.datetime(the_year, the_month, the_day, instance.time.hour, instance.time.minute, instance.time.second, tzinfo = pytz.utc) # Making an aware time
        is_aware_event_aware_datetime = timezone.is_aware(event_aware_datetime) # Making sure the event_aware_datetime is indeed aware
        instance.time = event_aware_datetime
        awareness_test = timezone.is_aware(instance.time) # Making sure instance.time is aware
        eventset.save()  # Here is where the exception is thrown.

Django应用程序无法将时间数据保存到Postgres。异常类型为DataError,异常值为:

^{pr2}$

^指向18的'

编辑: 这是我的数据库:

CREATE TABLE site_activity_event
(
    id serial NOT NULL,
    entry_id integer NOT NULL,
    "time" time without time zone NOT NULL,
     work text NOT NULL,
     CONSTRAINT site_activity_event_pkey PRIMARY KEY (id),
     CONSTRAINT site_activity_event_entry_id_fkey FOREIGN KEY (entry_id)
        REFERENCES site_activity_entry (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
    )

我做了sqlall我的应用程序,以确保模型字段的数据类型与应用程序的数据类型相对应,并且一切正常。这似乎是一个postgres问题,但是Django应该处理postgres(https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/#migration-guide)中所有令人讨厌的接口问题,因此我认为我遗漏了一些东西。任何帮助都是非常感谢的。在


Tags: theinstanceselfeventid应用程序datetimetime
2条回答

您的事件有一个时间域,但看起来数据库是用datetime字段创建的。在

那么,“18:43:04”是带时区的有效时间戳吗?你认为它指定了一个独特的时间点吗?如果这样做了,那么您就发现了PostgreSQL的日期/时间处理中的一个主要错误。如果没有,那么您要么提供一个有效的时间戳,要么在数据库中使用正确的类型——如果不了解这些事件的更多信息,我就不能说是哪种类型。在

相关问题 更多 >

    热门问题