[英]Django ValueError: Cannot assign must be an instance
当我尝试通过 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 文件片段 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()
如何解决这个问题? 有很多类似的问题,但我不知道如何在我的情况下解决这个问题。 谢谢你的帮助...
您需要创建一个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()
按照此链接了解get_or_create
您需要从终端使用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
model。)
这意味着您最初应该为 Kecamatan 创建另一个 json 文件,并使用loaddata
加载
[
{
"pk": 1,
"model": "app.kecamatan",
"fields": {
"kecamatan": "Ciawigebang",
},
{
"pk": "Cibeureum",
"model": "app.kecamatan",
"fields": {
"kecamatan": 1,
}
]
注意: app 应该是 Desa 和 Kecamatan 模型所在的应用程序的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.