【问题标题】:Django - Foreign Key must be an instanceDjango - 外键必须是一个实例
【发布时间】:2015-05-03 17:54:17
【问题描述】:

我有模特

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 对象来分配/创建ModelA 对象,因为它首先涉及查询用户模型然后插入。这就像对创建的每个 ModelA 对象进行额外的读取操作。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      如果性能有问题(一般情况下不是),您可以使 User 对象的读取操作尽可能轻。 only 函数将返回对象的查询集,强制选择仅检索 id 列,该列肯定已被索引。

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

      【讨论】:

      • 不完全正确,只是为了以后要读这个问题的人有办法,你可以ModelA.objects.create(phone=data['phone'], user=user_id) #in case ModelA related to user via user id, for other fields you can do user_name
      • 正确代码为:ModelA.objects.create(phone=data['phone'], user_id=1)
      • 为了澄清,弗拉德的第二条评论有效(即您可以忽略第一条评论中的代码)。
      猜你喜欢
      • 1970-01-01
      • 2019-08-20
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多