Django - 外键必须是一个实例

时间:2015-05-03 17:54:17

标签: django django-models

我是模特

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对象执行额外的读取操作。

2 个答案:

答案 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)