【问题标题】:Django Serialization of DateTime Objects within Dictionary字典中日期时间对象的 Django 序列化
【发布时间】:2011-01-15 20:45:05
【问题描述】:

我的 Django 视图方法如下。我想将 place_data 作为来自 HTTPRequest 的响应传递(在客户端的 getJSON 调用中,但这与问题无关)。

我可以很好地传递字典,直到包含 event_occurrences,它正在做一些幕后工作以传递具有开始和结束时间的事件字典。

def mobile_place_detail(request,place_id):

    callback = request.GET.get('callback', 'callback')
    place = get_object_or_404(Place, pk=place_id)
    event_occurrences = place.events_this_week()

    place_data = {
        'Name': place.name,
        'Street': place.street,
        'City': place.city,
        'State': place.state,
        'Zip': place.zip,
        'Telephone': place.telephone,
        'Lat':place.lat,
        'Long':place.long,
        'Events': event_occurrences,
    }
    xml_bytes = json.dumps(place_data)

    if callback:
        xml_bytes = '%s(%s)' % (callback, xml_bytes)
    print xml_bytes

    return HttpResponse(xml_bytes, content_type='application/javascript; charset=utf-8')

这是尝试对 event_occurrences 字典进行序列化的代码:

 def events_this_week(self):
    return self.events_this_week_from_datetime( datetime.datetime.now() )

 def events_this_week_from_datetime(self, now):

    event_occurrences = []
    for event in self.event_set.all():
        event_occurrences.extend(event.upcoming_occurrences())

    event_occurrences.sort(key=itemgetter('Start Time'))

    counter = 0
    while counter < len(event_occurrences) and event_occurrences[0]['Start Time'].weekday() < now.weekday():
        top = event_occurrences.pop(0)
        event_occurrences.insert(len(event_occurrences), top)
        counter += 1

    json_serializer = serializers.get_serializer("json")()
     return json_serializer.serialize(event_occurrences, ensure_ascii=False)
    return event_occurrences

event.upcoming_occurrences 的调用引用了以下函数:

def upcoming_occurrences(self):

        event_occurrences = []

        monday_time = datetime.datetime.combine(datetime.date.today() + relativedelta(weekday=MO), self.start_time)
        all_times = list(rrule(DAILY, count=7, dtstart=monday_time))

        weekday_names = ('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday')

        for idx, weekday in enumerate(weekday_names):
            if getattr(self, weekday):
                event_occurrences.append({
                    'Name': self.name,
                    'Start Time': all_times[idx],
                    'End Time': all_times[idx] + datetime.timedelta(minutes=self.duration)
                })

        return event_occurrences

这给了我以下错误:

Exception Type: AttributeError
Exception Value:    'dict' object has no attribute '_meta'

我意识到我不能只在我的 event_occurrences 对象上调用 json.dumps(),但不知道如何解决这个序列化错误(这是我第一次使用序列化Python)。有人可以给我一些关于序列化需要如何以及在哪里进行的指导吗?

提前致谢!

更新:添加了函数调用以帮助澄清问题。请参见上文。

【问题讨论】:

  • 困惑。 json_serializer 代码与上面的函数有什么关系?它叫什么名字?为什么你不能在那个字典上也使用json.dumps?为什么你没有接受你提出的一个问题的答案?

标签: python django datetime serialization


【解决方案1】:

Django 的序列化框架适用于 QuerySet,而不是 dicts。如果您只想将字典转储到 JSON,只需使用 json.dumps。通过传入一个自定义序列化类可以轻松地序列化对象 - Django 中已经包含一个处理日期时间的类:

from django.core.serializers.json import DjangoJSONEncoder
json.dumps(mydict, cls=DjangoJSONEncoder)

【讨论】:

  • 哇!谢谢丹尼尔。这正是我想要的——啊,Django 总是让事情变得如此简单。
  • 谢谢,正是我想要的答案!
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2014-12-27
相关资源
最近更新 更多