Django saving json value to database/model
Question:
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…
Answers:
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()
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
If you want to store the intact JSON, try using the django-jsonfield project: https://github.com/dmkoch/django-jsonfield
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"})
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',
}],
},
})
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…
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()
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
If you want to store the intact JSON, try using the django-jsonfield project: https://github.com/dmkoch/django-jsonfield
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"})
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',
}],
},
})