Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

json django model with custom fields representation

I have the following model:

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)

I want to json this model with custom representation to pass it in javascript. I used the follow code for this by iterating through 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
    }

But this part looks ugly. Is there a way to replace it with something nicer. I could use the followings

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

I just don't know how to come across. For example

  • json.dumps needs a pure Python list of dictionaries, but __repr__ returns QuerySet which I don't know how to conrent.
  • If I use model_to_dict or serializers or list(messages.values()) I can't join the User's field username instead of userid.
like image 954
deathangel908 Avatar asked Dec 05 '25 08:12

deathangel908


1 Answers

I added property to my model class

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
    }

And used comprehensions:

import json
messages = Messages.objects.all()
json.dumps([message.json for message in messages])
like image 156
deathangel908 Avatar answered Dec 08 '25 21:12

deathangel908



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!