json django模型与自定义字段表示

时间:2014-12-28 14:00:42

标签: json django-models

我有以下型号:

class Messages(models.Model):
    userid = models.ForeignKey(User)
    time = models.TimeField(default=datetime.datetime.now)
    content = models.CharField(max_length=255)
    id = models.AutoField(primary_key=True)

我想用自定义表示json这个模型在javascript中传递它。我通过迭代QuerySet

使用了以下代码
messages = Messages.objects.all()
passed_messages = []
for singleMess in messages:
    passed_messages.append(get_message(singleMess))
response = json.dumps(passed_messages)

def get_message(message):
    return {
        'user': User.objects.get_by_natural_key(message.userid).username,
        'content': message.content,
        'hour': message.time.hour,
        'minute': message.time.minute,
        'id': message.id
    }

但这部分看起来很难看。有没有办法用更好的东西取而代之。我可以使用以下

__repr__ in models.py 
django.core.serializers 
django.forms.models.model_to_dict 
Messages.objects.all().values()

我只是不知道如何碰到。 例如

  • json.dumps 需要一个纯Python的词典列表,但 __ repr __ 会返回 QuerySet ,我不知道如何转义。
  • 如果我使用 model_to_dict 序列化程序列表(messages.values()),我无法加入用户&#39 ; s字段用户名而不是userid。

1 个答案:

答案 0 :(得分:2)

我将属性添加到我的模型类

class Messages(models.Model):
    userid = models.ForeignKey(User)
    time = models.TimeField(default=datetime.datetime.now)
    content = models.CharField(max_length=255)
    id = models.AutoField(primary_key=True)

  @property
  def json(self):
    return {
    'user': User.objects.get_by_natural_key(self.userid).username,
    'content': self.content,
    'time': self.time.strftime("%H:%M:%S"),
    'id': self.id
    }

并使用了理解:

import json
messages = Messages.objects.all()
json.dumps([message.json for message in messages])