Django夹具:导入嵌套模型

时间:2018-02-10 21:03:30

标签: python json django

Python和Django的新手并尝试导入.json文件。 JSON文件的结构使得每个根级对象都有一个嵌套对象。

例如,JSON的结构为:

[
{
    "model": "testapp.Person",
    "pk": 1,
    "fields": {
        "firstName":"Jane", 
        "lastname":"Doe", 
        "haircolor":"black",
        "mailingaddress": {
            "streetaddress": "1214 Example St.",
            "city": "Silver Spring",
            "state": "MD",
            "zipcode": "20910"
        }
    }
}
]

python模型定义如下:

from django.db import models

# Create your models here.
class address(models.Model):
    streetaddress = models.CharField(max_length=200)
    city = models.CharField(max_length=200)
    state = models.CharField(max_length=5)
    zipcode = models.CharField(max_length=10)

    def __init__(self, streetaddress, city, state, zipcode):
        self.streetaddress = streetaddress
        self.city = city
        self.state = state
        self.zipcode = zipcode

class Person(models.Model):
    firstName = models.CharField(max_length=200)
    lastname = models.CharField(max_length=200)
    haircolor = models.CharField(max_length=200)
    mailingaddress = address(streetaddress, city, state, zipcode)

运行python manage.py loaddata时出错,因为很明显,init参数streetaddress, city, state, zipcode在该上下文中不存在。

如何构建模型以动态生成其他对象?

1 个答案:

答案 0 :(得分:0)

根据您的模型结构,您必须首先创建地址记录。这将是您用来保存到您创建的 Person 对象的记录。所以,你的装置看起来像这样

[
    {
        "model": "app_name.address",
        "pk": 1,
        "fields": {
            "streetaddress": "1214 Example St.",
            "city": "Silver Spring",
            "state": "MD",
            "zipcode": "20910"
        }
    },
    {
        "model": "app_name.person",
        "pk": 1,
        "fields": {
            "firstName":"Jane", 
            "lastname":"Doe", 
            "haircolor":"black",
            "mailingaddress":1
        }
    },
]

请注意,mailingaddress 有一个“1”作为表示记录主键的值,这就是您所需要的。 只需向 JSON 数组对象添加另一个元素,您就可以将更多人添加到同一地址。

另一种确保您的 JSON 固定文件具有正确结构的方法是添加一些虚拟数据(一个记录应该这样做),然后将该数据转储到一个文件(例如 dump.json)中,然后将该文件编辑为满足您的需求。

django documentation 也很不错,因此我建议您也查看它以获得更多指导。

附注: 在这种情况下,您也不需要 __init__ 构造函数