16

Im new to django and im trying to save json to database. The problem is that im able to get data the data in my views but not sure how to save it in database. Im trying to save the comments

models.py

class Post(models.Model):
    title=models.CharField(max_length=200)
    description=models.TextField(max_length=10000)
    pub_date=models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=40, unique=True)

    def __unicode__(self):
        return self.title


class Comment(models.Model):
    title=models.ForeignKey(Post)
    comments=models.CharField(max_length=200)

    def __unicode__(self):
        return '%s' % (self.title)

serializer.py

class CommentSerializer(serializers.ModelSerializer):
    id = serializers.CharField(source="title.id", read_only=True)
    title = serializers.CharField(source="title.title", read_only=True)

class Meta:
    model = Comment
    fields = ('id','title','comments')


class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('id','title','description','pub_date')

Please help me saving the data from views to database

view.py

def add_comments(request):
    if 'application/x-www-form-urlencoded' in request.META['CONTENT_TYPE']:
        print 'hi'
        data = json.loads(request.body)
        comment = data.get('comment', None)
        id = data.get('id', None)
        title = data.get('title', None) 
        ....................# not sure how to save to database
       pass

Thanks in advance........Please let me know if there is any better way to do it...

5 Answers 5

13

If you're using Postgres, you can store json with JSONField (read more), but if not, you need parse json to string and save with CharField/TextField using json.dumps(data). To recovery data, use json string to dict with json.loads(json_string)

Remember to import json lib: import json

Update 2023

Based on @Jarad comment,

JSONField is supported on MariaDB, MySQL, Oracle, PostgreSQL, and SQLite (with the JSON1 extension enabled).

https://docs.djangoproject.com/en/4.2/ref/models/fields/#jsonfield

Sign up to request clarification or add additional context in comments.

1 Comment

JSONField is supported on MariaDB, MySQL, Oracle, PostgreSQL, and SQLite (with the JSON1 extension enabled). Django 4.2 Docs
8

Assuming a model of:

class User(models.Model):
  name = models.CharField()
  phone_number = models.CharField()

Sending json of {"name":"Test User", "phone_number":"123-456-7890"}

In the view you could do the following to save it to the database.

def SaveUser(request):
  body_unicode = request.body.decode('utf-8')
  body = json.loads(body_unicode)
  u = User(**body)
  u.save()
  return JsonResponse({"result": "OK"})

Comments

3

If I understand your question clearly then Your view should be something like.

def add_comments(request):
    if 'application/x-www-form-urlencoded' in request.META['CONTENT_TYPE']:
        print 'hi'
        data = json.loads(request.body)
        comment = data.get('comment')
        id = data.get('id')
        title = data.get('title') 
        
        post = Post.objects.get(id = id)
        com = Comment()
        com. comments = comment
        com.title = post
        com.save()

2 Comments

Thanks for reply...Yes this is what is required.........Is there a better way of storing data...instead of individually adding data......?
(de)serializations in django
3

If you want to store the intact JSON, try using the django-jsonfield project: https://github.com/dmkoch/django-jsonfield

Comments

0

according to Django doc you can use :

from django.contrib.postgres.fields import JSONField
from django.db import models

class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = JSONField()

    def __str__(self):
        return self.name

then create with this :

Dog.objects.create(name='Rufus', data={
     'breed': 'labrador',
     'owner': {
         'name': 'Bob',
         'other_pets': [{
             'name': 'Fishy',
         }],
     },
})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.