如何向采用JSON字符串并创建新记录的模型添加方法

时间:2018-11-12 01:38:05

标签: django python-3.x django-models django-rest-framework

我需要创建两个Django模型:“患者”和“胚胎”。

“患者”属性: 名(字符串) 姓氏(字符串) 电话号码(字符串) 电子邮件(字符串) 创建于(日期时间)

“胚胎”特性: 名称(字符串) 分析结果(文本) 创建于(日期时间) 患者的全名 病人(外键)

我现在需要向“患者”模型中添加一个方法,该方法采用JSON字符串并创建新的“胚胎”记录。 这是JSON字符串:

[
{
"name": "embryo_1",
"analysis_results": "46,XX"
},
{
"name": "embryo_2",
"analysis_results": "47,XY,+21"
},
{
"name": "embryo_3",
"analysis_results": "46,XY"
},
]

下面是我创建的模型 我不确定如何向采用JSON字符串并创建新的“胚胎”记录的“患者”模型添加方法。

class Patient(models.Model):
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=35)
    phone = models.CharField(max_length=18)
    email = models.EmailField(unique=True)
    created_at =  models.DateTimeField(auto_now_add=True)



class Embryo(models.Model):
     name = models.CharField(max_length=45)
     analysis_result = models.Charfield(max_length=10)
     created_at = models.DateTimeField(auto_now_add=True)
     patient = models.ForeignKey(Patient, on_delete=models.CASCADE)

    @property
    def patient_full_name(self):
       return "%s %s" % (self.patient.first_name, self.patient.last_name)

2 个答案:

答案 0 :(得分:1)

您可以将实例方法添加到模型类中,就像其他任何python class一样。

  • 从json字符串中加载dict,(最好使用json.loads)。
  • 实例化Embryo对象的列表。
  • 将列表传递给bulk_create方法,以在一个查询中创建多个对象。

示例

import json

class Patient(models.Model):
    # fields

    def add_embryos(self, embryos_json_str='{}'):
        embryos = json.loads(embryos_json_str)

        embryo_objs = []
        for embryo in embryos:
            embryo_objs.append(Embryo(
                name=embryo['name'],
                analysis_result=embryo['analysis_results'],
                patient=self
            ))

        Embryo.objects.bulk_create(embryo_objs)

注意

  • 您可以将json.loads包装在try-except块中,以免引发任何不必要的异常。
  • 如果json中的胚胎对象过多,请使用batch_size的{​​{1}}参数批量插入。

答案 1 :(得分:0)

可能没有必要专门采用此方法:

您可以使用python的json.loads()加载到词典列表中,然后循环创建模型。

import json

在文件的开头,然后在您的视图中:

#get the string from your request or form or wherever you get it
dict_list = json.loads('[{...}, {...}, {...}]'

for entry in dict_list:
    Embryo.objects.create(**entry)

(**entry)语法将dict解压缩为kwargs

希望这可以解决您的问题! :)