Django - 外键必须是一个实例

Django - Foreign Key must be an instance

我有模型

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

到这里一切正常。

现在,我的问题是,是否有任何其他方法可以直接使用 user_id 而不是 User 对象 assigning/creating ModelA 对象,因为它首先涉及查询用户模型然后插入。它就像为每个创建的 ModelA 对象执行额外的读取操作。

(我一直在为错误的答案投票。如果您使用的数据库具有实际的完整性检查,您可以只使用 attr_name_id 来插入相关对象。

希望我可以删除它。看看下面的答案。)

基本上,你不能那样做。 Django 的 ORM 需要一个对象而不仅仅是一个键。这是要在应用程序级别而不是数据库级别检查完整性的额外抽象层所要付出的代价。

如果性能有问题(一般情况下不会),您可以使用户对象的读取操作尽可能轻松。 only 函数将 return 对象的查询集,强制 select 仅检索 id 列,该列肯定已编入索引。

user = User.objects.only('id').get(id=data['user_id'])
obj = ModelA.objects.create(phone=data['phone'], user=user)

从我的历史评论中可以看出,接受的答案并不完全正确。 因此 @yekta 要求我重新提交我的评论:

要创建父模型,请使用如下整数值:

ModelA.objects.create(phone=data['phone'], user_id=1)