如何在 Django 模型中加载 JSON 数据

Huz*_*yed 1 django json django-models

我想在我的模型中加载以下 json 数据。

{
    "99popularity": 79.0,
    "director": "William Cottrell",
    "genre": [
      "Animation",
      " Family",
      " Fantasy",
      " Musical",
      " Romance"
    ],
    "imdb_score": 7.9,
    "name": "Snow White and the Seven Dwarfs"
  },
  {
    "99popularity": 84.0,
    "director": "Stanley Kubrick",
    "genre": [
      "Adventure",
      " Mystery",
      " Sci-Fi"
    ],
    "imdb_score": 8.4,
    "name": "2001 : A Space Odyssey"
  },
Run Code Online (Sandbox Code Playgroud)

我使用 json 数据的引用创建了两个模型

class Genre(models.Model):
    name = models.CharField(max_length=30)

class Movie(models.Model):
    popularity = models.FloatField(max_length=10)
    director = models.CharField(max_length=30)
    genre = models.ManyToManyField(Genre)
    imdb_score = models.FloatField(max_length=10)
    name = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

但在Genre模型中我没有任何data,而在流派部分则json没有。我如何在我的模型中加载该数据。请帮忙。idname

p14*_*14z 5

您可以使用get_or_create方法,但必须使名称字段唯一。要使用对 json 数据的引用创建两个模型,我将使用如下所示的自定义类方法:

class Genre(models.Model):
    name = models.CharField(max_length=30, unique=True)  # make unique

class Movie(models.Model):
    popularity = models.FloatField(max_length=10)
    director = models.CharField(max_length=30)
    genre = models.ManyToManyField(Genre)
    imdb_score = models.FloatField(max_length=10)
    name = models.CharField(max_length=30)


    @classmethod
    def create(cls, **kwargs):
        movie = cls.objects.create(
            popularity=kwargs['99popularity'],
            director=kwargs['director'],
            imdb_score=kwargs['imdb_score'],
            name=kwargs['name']
        )
        for genre_name in kwargs['genre']:
            genre, created = Genre.objects.get_or_create(name=genre_name)
            movie.genre.add(genre)
        return movie

Run Code Online (Sandbox Code Playgroud)

假设您将 json 数据转换为字符串,您可以执行以下操作:

import json
from .models import Movie

# you can also keep this inside a view
with open('movie_data.json', encoding='utf-8') as data_file:
    json_data = json.loads(data_file.read())

    for movie_data in json_data:
        movie = Movie.create(**movie_data)
        # movie and genres created
Run Code Online (Sandbox Code Playgroud)