【问题标题】:Django ValueError: Cannot assign must be an instanceDjango ValueError:无法分配必须是一个实例
【发布时间】:2021-05-05 12:38:44
【问题描述】:

当我尝试通过 manage.py shell 向我的数据库插入数据时,我得到了这个错误

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

这是我的models.py

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 文件 sn-p 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()

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

【问题讨论】:

    标签: python json django django-models


    【解决方案1】:

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

    加载数据的格式应该是这样的:

    [
        {
         "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,
             }
     ]
    

    注意: app 应该是 Desa 和 Kecamatan 模型所在的应用的名称。

    【讨论】:

      【解决方案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

      【讨论】:

      • 它可以工作,但它创建了许多'kecamatan'对象,我的意思是例如在'kecamatan:cibeureum'的scrap.json文件中有8个'desa'并在数据库中创建8个'kecamatan' cibeureum”。只能创建一个吗?
      • @triefauzan 是的,你说得对。我更新了答案
      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2019-11-14
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多