модель в формате JSON в Django пользовательские представления полей
У меня есть следующая модель:
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.дампы должен список на чистом Python словарей, но __репр__ возвращает QuerySet , который я не знаю, как подтвердить.
- Если я использую model_to_dict или сериализаторы или список(сообщений.values ()) я не могу присоединиться к полю пользователя username вместо userid.
1 ответ:
Я добавил свойство в свой класс модели
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])