【问题标题】:How to save a Foreign Key in Django without instance, but a hard coded value如何在没有实例的情况下在 Django 中保存外键,但使用硬编码值
【发布时间】:2020-03-06 14:10:12
【问题描述】:

假设我有这两个模型:

class Shipment(models.Model):
    id = models.BigIntegerField(primary_key=True)
    order_id = models.ForeignKey('orders.Order', null=True, blank=True, on_delete=models.SET_NULL)

class Order(models.Model):
    id = models.BigIntegerField(primary_key=True)
    ean = models.BigIntegerField(null=True, blank=True)

订单已在数据库中填充,现在我只想将发货链接到相关订单。但我有一个硬编码 JSON 列表来填充我的发货模型。

{
"shipmentId": 541757635,
"orderId": 23598235,
}

因此,该 JSON 中的 orderId 表示数据库中已经存在的 Order 模型的主键。我如何循环这个以根据 order_id 将发货模型与正确的订单模型连接起来?

可能是这样的循环:

for shipment in shipments:
    shipment = Shipment.objects.create(id=shipment.shipmentId, order_id=shipment.orderId

但这可能是因为没有实例,只有 JSON 中的硬编码值吗?

更新: 所以当我尝试使用这个循环时,我得到了这个错误:

    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "2647598550": "Shipment.order_id" must be a "Order" instance.

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您的示例循环应该做到这一点。只要在调用.save() 之前执行此操作,您就可以将ID 指定为任何您想要的。使用.create(id=foo) 构建实例应该可以做到这一点。

    要设置外键字段,可以先get相关实例使用id为Order.objects.get(id=order_id)

    示例代码:

    for shipment in shipments:
        order = Order.objects.get(id=shipment.orderId)
        shipment = Shipment.objects.create(id=shipment.shipmentId, 
                                           order_id=order)
    

    相关:Django error. Cannot assign must be an instance

    来源:https://docs.djangoproject.com/en/2.2/ref/models/instances/#explicitly-specifying-auto-primary-key-values

    【讨论】:

    • 如果我这样做我得到这个错误:ValueError: Cannot assign "2647598550": "Shipment.order_id" must be a "Order" instance.
    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2011-03-08
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多