如何在dict中传递ForeignKey来创建Model对象.姜戈



我创建了一个模型来存储用户名并放置

class UserDetails(models.Model):
name = models.CharField(max_length=50)
place = models.ForeignKey(City, on_delete=models.CASECADE)

我有一个JSON文件,我有1000多个用户的数据。像

[
{"name": "A", "place":1},
{"name": "B", "place":3},
{"name": "C", "place":4},
{"name": "D", "place":1},
..
..
]

位置字段与城市对象id相关。当我使用以下语法时

UserDetails.objects.create(**{"name":"A", "place": 3})

然后得到一个错误,我知道我必须传递obj,而不是传递位置id,比如:

loc = City.object.get(id=3)
UserDetails.objects.create(**{"name":"A", "place": loc})

这很好,但我有大量的数据,我如何传递位置id,或者应该使用bulk_create来保存模型中的所有JSON数据?

您可以使用place_id,这是;双字段";Django创建存储在数据库中的,并存储对目标模型的引用(通常是主键(,当然这样的Place已经存在:

user_details = [
UserDetails(name=record['name'],place_id=record['place'])
for record in list_of_records
]
UserDetails.object.bulk_create(user_details)

因此,这里的list_of_records就是您的字典列表。我们可以使用.bulk_create(…)[Django-doc]在少量插入查询中添加所有UserDetails

这似乎在起作用:

def model_to_dict_wfk(modelobj):
opts = modelobj._meta.fields
modeldict = model_to_dict(modelobj)
for m in opts:
if m.is_relation:
foreignkey = getattr(modelobj, m.name)
if foreignkey:
try:
modeldict[m.name] = foreignkey
except:
pass
return modeldict

然后在创建类方法中使用返回的字典

@classmethod
def create(cls, vals):
obj = cls(**vals)
obj.save()
return obj

最新更新