Django ValueError:无法分配必须是实例

2024-09-27 18:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图通过manage.py shell将数据插入数据库时,出现了以下错误

ValueError: Cannot assign "'Ciawigebang'": "Desa.kecamatan" must be a "Kecamatan" instance.

这是我的模特

from django.db import models

class Kecamatan(models.Model):
    kecamatan = models.CharField(max_length=30)

    def __str__(self):
        return self.kecamatan

class Desa(models.Model):
    desa = models.CharField(max_length=30)
    kecamatan = models.ForeignKey(Kecamatan, null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.desa

这里是我的json文件snippet scrap.json

[
    {
        "Kecamatan": "Ciawigebang",
        "Desa": [
            "Ciawigebang",
            "Ciawilor",
            "Cigarukgak",
            "Cihaur",
            "Cihirup",
            "Cijagamulya",
            "Cikubangmulya",
            "Ciomas",
            "Ciputat",
            "Dukuhdalem",
            "Geresik",
            "Kadurama",
            "Kapandayan",
            "Karangkamulya",
            "Kramatmulya",
            "Lebaksiuh",
            "Mekarjaya",
            "Padarama",
            "Pajawanlor",
            "Pamijahan",
            "Pangkalan",
            "Sidaraja",
            "Sukadana",
            "Sukaraja"
        ]
    },{
        "Kecamatan": "Cibeureum",
        "Desa": [
            "Cibeureum",
            "Cimara",
            "Kawungsari",
            "Randusari",
            "Sukadana",
            "Sukarapih",
            "Sumurwiru",
            "Tarikolot"
        ]
    },{
        "Kecamatan": "Cibingbin",
        "Desa": [
            "BANTAR PANJANG",
            "CIANGIR",
            "Cibingbin",
            "Cipondok",
            "CISAAT",
            "Citenjo",
            "DUKUHBADAG",
            "Sindang Jawa",
            "SUKA MAJU",
            "SUKAHARJA"
        ]
    }...
]

这是我用来将数据从python manage.py shell插入数据库的代码

import json
from apps.models import Desa, Kecamatan
with open('scrap.json') as f:
    daerahs = json.load(f)

for daerah in daerahs:
    for x in daerah['Desa']:
        y=Desa(desa=x, kecamatan=daerah['Kecamatan'])
        y.save()

如何解决这个问题?有这么多类似的问题,但我不知道如何解决这个问题在我的情况下。谢谢你的帮助


Tags: 数据pyimportself数据库jsonmanagemodels
2条回答

您需要创建一个Kecamatan instance。将您的代码更改为此

for daerah in daerahs:
    kecamatan, created = Kecamatan.objects.get_or_create(kecamatan=daerah['Kecamatan'])
    for x in daerah['Desa']:
        y = Desa(desa=x, kecamatan=kecamatan)
        y.save()

按照这个link来理解get_or_create

您需要从终端python manage.py loaddata scrap.json使用loaddata

加载数据的格式应如下所示:

[
    {
     "pk": 1,
     "model": "app.desa",
     "fields": {
     "kecamatan": 1,
     "desa": "Ciawigebang"
     },
      {
     "pk": 2,
     "model": "app.desa",
     "fields": {
     "kecamatan": 1,
     "desa": "Ciawigebang"
     }
]

对于Desa的每个实例,您提供一个唯一的id,对于kecamatan字段,您使用它的id,因为它是外键(在填充Desa模型之前,您需要使用值填充Kecamatan模型。)

这意味着您应该首先为Kecamatan创建另一个json文件,并使用loaddata加载

[
        {
         "pk": 1,
         "model": "app.kecamatan",
         "fields": {
         "kecamatan": "Ciawigebang",
         },
          {
         "pk": "Cibeureum",
         "model": "app.kecamatan",
         "fields": {
         "kecamatan": 1,
         }
 ]

注意:应用程序应该是Desa和Kecamatan模型驻留的应用程序的名称

相关问题 更多 >

    热门问题