Django将JSON值保存到数据库/模型

16

我是django的新手,正试图将json保存到数据库。问题在于我能够在视图中获取数据,但不确定如何将其保存到数据库中。我试图保存评论。

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)

序列化器.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')
请帮助我将视图中的数据保存到数据库。
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

提前致谢……如果有更好的方法,请告诉我……

5个回答

13
如果您正在使用Postgres,可以使用JSONField阅读更多)存储json数据,但如果不是,则需要将json解析为字符串,并使用CharField/TextFieldjson.dumps(data)的形式保存。要恢复数据,请使用json字符串转换为字典json.loads(json_string)
记得导入json库:import json

2023年更新

根据@Jarad的评论:

在MariaDB、MySQL、Oracle、PostgreSQL和SQLite(启用了JSON1扩展)上支持JSONField。

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


1
JSONField在MariaDB、MySQL、Oracle、PostgreSQL和SQLite(启用了JSON1扩展)上都得到支持。Django 4.2文档 - Jarad

8
假设一个模型为:
class User(models.Model):
  name = models.CharField()
  phone_number = models.CharField()

发送JSON {"name":"测试用户", "phone_number":"123-456-7890"}

在视图中,您可以执行以下操作将其保存到数据库中。

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

3
如果我理解你的问题正确,那么你的视图应该类似于:
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()

谢谢回复...是的,这就是所需的......有没有更好的存储数据的方法......而不是逐个添加数据......? - Coeus
在Django中的(反)序列化 - YaserKH

3

0
根据 Django doc,你可以使用以下内容:
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

然后用这个创建:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接