Vingtoft
Vingtoft

Reputation: 14596

Django: Create and save a model using JSON data

Im building an app using Django 1.10 as backend and Angular 2 4.0 for frontend.

Is it possible to create and save a model instance from a JSON data object?

Example: This model:

class PartOne(models.Model):
  gender = models.SmallIntegerField(choices=[(1, "Male"), (2, "Female")])
  gender_na = models.BooleanField(default=False)
  height = models.SmallIntegerField()
  height_na = models.BooleanField(default=False)

JSON:

json = {
'gender': 1,
'gender_na':False,
'height':195,
'height_na':False
}

I dont want to manually create the model:

PartOne.objects.create(gender=json['gender'], gender_na=json['gender_na'], height=json['height'], height_na=json['height_na]

Im looking for an automated solution, like this:

PartOne.objects.create_from_json(json)

Upvotes: 17

Views: 18472

Answers (3)

thisispurecode
thisispurecode

Reputation: 1

There is another way I use, create a method in the model (serialize) and then use JsonResponse to return:

class User(AbstractUser):
    u_username = models.CharField(max_length=100, default=None, blank=True, null=True)
    p_pic = models.CharField(max_length=500, default=None, blank=True, null=True)
    p_comment = models.CharField(max_length=200, default=None, blank=True, null=True)

    def serializeProfile(self):
        return {
            "pk": self.pk,
            "username": self.username,
            "email": self.email
        }

And then call the function, inside of the jsonRespone:

u_profile = User.objects.get(username='username')
JsonResponse(u_profile.serializeProfile())

The above worked for me.

Upvotes: 0

zaidfazil
zaidfazil

Reputation: 9235

You could just do,

PartOne.objects.create(**json)

You can use the **kwargs syntax when calling functions by constructing a dictionary of keyword arguments and passing it to your function.

This is documented on section 4.7.4 of python tutorial., under unpacking argument lists.

Also, note that the same dict is not passed into the function. A new copy is created, so "json" is not kwargs.

Upvotes: 25

whp
whp

Reputation: 1514

You may also want to take a look at modelform_factory if you want to run more validation on your data or have more control over input. You can also do good stuff like attaching files.

from django.forms.models import modelform_factory

form = modelform_factory(PartOne, fields=('gender', 'gender_na', 'height', 'height_na',))
populated_form = form(data=my_json)

if populated_form.is_valid():
    populated_form.save()
else:
    # do something, maybe with populated_form.errors

Upvotes: 3

Related Questions