我是模特
from django.contrib.auth.models import User
class ModelA(models.Model):
phone = models.CharField(max_length=20)
user = models.ForeignKey(User)
我需要将数据插入此模型中。我托管了一个端点,它为我提供了以下数据{'phone':XXXXXXXX, 'user_id':123}
。
现在我将数据插入此模型,如
obj = ModelA.objects.create(phone=data['phone'], user = data['user_id]
它抛出一个错误说
Cannot assign "u'123'": "ModelA.user" must be a "User" instance.
同意,因为因为使用django orm,你可以根据对象而不是数字进行交互。因此,我首先找到了User的对象,然后创建了ModelA对象。
user_obj = User.objects.get(id=data['id']
modelobj = ModelA.objects.create(phone=data['phone'], user = user_obj
直到这里一切正常。
现在,我的问题是,是否存在使用ModelA
而不是user_id
对象直接分配/创建User
对象的任何其他方式,因为它首先涉及查询用户模型然后插入。它就像为每个创建的ModelA对象执行额外的读取操作。
答案 0 :(得分:7)
从我的历史评论中可以看出,接受的答案并不正确。 因此@yekta要求我重新提交我的意见:
要创建父模型,请使用整数值,如:
ModelA.objects.create(phone=data['phone'], user_id=1)
答案 1 :(得分:5)
(我一直在为一个错误的答案获得投票。如果你使用的数据库有实际的完整性检查,你可以使用 attr_name _id来插入相关的对象。
希望我能删除它。看看下面的答案。)
基本上,你不能这样做。 Django的ORM期待一个对象而不仅仅是一个密钥。支付额外的抽象层需要付出代价才能检查应用程序级别的完整性,而不是DB级别。
如果性能有问题(并且在一般情况下它不是),则可以使User对象的读取操作尽可能轻。 only
函数将返回一个对象的查询集,强制select只检索id列,这肯定是索引的。
user = User.objects.only('id').get(id=data['user_id'])
obj = ModelA.objects.create(phone=data['phone'], user=user)