【问题标题】:Django 1.9 - JSONField in ModelsDjango 1.9 - 模型中的 JSONField
【发布时间】:2016-08-28 16:11:04
【问题描述】:

我正在尝试使用新的 JSONField 在 Django 1.9 中设置模型文件。我找到了使用 postgres 的示例,但没有找到使用 MySql 的示例。在 postgres 的例子中,他们做了一个

from django.contrib.postgres.fields import JSONField

如何为 MySql 导入它? 谢谢

【问题讨论】:

  • 我认为 JSONField 可能是一个 PostgreSQL-only 字段

标签: django


【解决方案1】:

更新:Django 3.1 现在原生支持多个数据库的JSONFieldhttps://docs.djangoproject.com/en/dev/releases/3.1/#jsonfield-for-all-supported-database-backends


如其他答案所述,Django 的原生 JSONField(从 1.9 和 1.10 开始)适用于 PostgreSQL。

幸运的是,MySQL 5.7.8+ 带有native JSON datatype。您可以使用 django-mysql 包和 Django 1.8+

将其添加到您的 Django 项目中

pip install django-mysql

from django.db import models
from django_mysql.models import JSONField

class MyModel(models.Model):
    my_json_field = JSONField()

阅读更多关于 django_mysql JSONField here.

【讨论】:

  • 这应该是答案
  • 那么这种模型的序列化器应该是什么样的?!我正在使用django-mysql,但无法弄清楚如何构造序列化程序。请你给我一个提示或什么的。非常感谢。
  • @Albert 你不应该需要序列化程序。 Django-MySQL 将接受 json.dumps 接受的任何内容并将其存储为 JSON。我相信如果您想在数据库中获取行并将其作为 JSON 返回(例如,在 API 中),您只需要一个序列化程序。在这种情况下,您应该使用 django-rest-framework 之类的东西。在此处查看 JSONField 的文档:django-mysql.readthedocs.io/en/latest/model_fields/…
【解决方案2】:

Django JSONField 仅是 Postgres。

https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.JSONField

更新:

通过 3rd 方库 django-mysql

支持 MYSQL

【讨论】:

    【解决方案3】:
    # Install jsonfield package
    pip install jsonfield
    
    # Define my model
    from django.db import models
    import jsonfield
    
    class MyModel(models.Model):
        the_json = jsonfield.JSONField()
    

    更多详情:https://pypi.python.org/pypi/django-jsonfield

    【讨论】:

    • 我正在尝试使用 Django 1.9 提供的内置功能。
    • @Rjay155 你不能没有 postgres。您甚至可以从django.contrib.postgres 导入它。您唯一的选择是使用第 3 方模块。
    • 使用“pip install django-jsonfield”
    【解决方案4】:

    我知道这个问题是关于 Django 1.9 的,但是 JSONField 现在可以与 Django 3.1 发布的所有受支持的数据库后端一起使用。

    【讨论】:

      【解决方案5】:

      今天我建议在 Django 3 中为所有数据库后端使用 jsonfield2 或等待 native JSON support

      【讨论】:

        【解决方案6】:

        尝试将此模型的数据保存在我本地机器上的 postgres db 中:

        models.py:

        from django.db import models
        from django import forms
         
        from inputData.models import Input
         
        from django.contrib.postgres.fields import JSONField
         
        class Results(models.Model):
         
            generator = models.OneToOneField(Input, on_delete = models.CASCADE, primary_key = True)
         
            pvalues = JSONField()
        

        views.py

        def result(req, res_id):
            try:
                inp = Input.objects.get(pk = res_id)
                path = os.path.join(BASE_DIR, 'uploads\\' + str(res_id) + '\\t.txt')
                p_values = parse_res.main(path) 
                res = Results(generator = inp, pvalues = p_values)
                res.save(using = 'results')
            except Results.DoesNotExist:
                raise Http404
            return render(req, 'result.html', {'res': res})
        

        settings.py

        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            },
            'results': {
                'ENGINE':'django.db.backends.postgresql',
                'NAME': 'results',
                'PASSWORD': 'password',
                'USER': 'user',
                'HOST': '127.0.0.1',
                'PORT': '8000'
        
            }
            
        }
        

        模型结果(参见 models.py)使用 JSONField,它有大约 200 字节的数据 但是在代码views.py 浏览器的res.save(... 行的响应时间过长。

        JSON 有什么问题? 服务器除了缓存还有什么问题?

        【讨论】:

          猜你喜欢
          • 2016-08-07
          • 2016-05-30
          • 2021-07-31
          • 1970-01-01
          • 2016-11-29
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 2021-08-17
          相关资源
          最近更新 更多