Django,Python2.7:将多条记录插入到两个相关的表中

2024-09-19 23:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

刚到Django orm,我需要指导:

我想在一个表中插入5条记录,用PK'table1Primary'表示'Table1'

然后将相同数量的记录插入另一个表“Table2”,表1 PK“table1Primary”作为外键

你知道吗示例:Table1 primary钥匙

  1. pk1型
  2. pk2型
  3. pk3型
  4. pk4型

表2外键

  1. pk1型
  2. pk2型
  3. pk3型
  4. pk4型

[我宁愿使用bulk\u create或任何其他优化方式,而不是编写单独的insert语句]

代码不起作用,我假设是因为这一行
eft\u fulfillment\u uid=ef,我以每秒5*5次插入结束

 for i in range(5):
    ef = Fulfillment.objects.create(
        fullfillment_uid=generateid(),
        ...
        ...
    )
    ef.save()

for i in range(5):
    por = OutReq.objects.create(
        out_req_uid=random.randint(500, 1000000000),
        fulfillment_uid=ef,
        ...
        ...
    )
    por.save()

Tags: inforuidcreate记录外键pkef
2条回答

如果要为每个Fulfillment对象保存一个新的OutReq对象,请在同一循环中进行。否则,您将只使用ef设置为的最后一个值。你知道吗

for i in range(5):
    ef = Fulfillment.objects.create(
        fullfillment_uid=generateid(),
        ...
        ...
    )
    por = OutReq.objects.create(
        out_req_uid=random.randint(500, 1000000000),
        fulfillment_uid=ef.fullfillment_uid,
        ...
        ...
    )

而且,Django使用id作为默认主键。你应该有一个很好的理由来改变这一点。所以,最好这样做

for i in range(5):
    ef = Fulfillment.objects.create(
        ...
        ...
    )
    por = OutReq.objects.create(
        out_req_uid=random.randint(500, 1000000000),
        fulfillment_uid=ef.id,
        ...
        ...
    )

然后Fulfillment将自动获得一个名为id(别名为pk)的新主键,您可以在第二个对象中将其用作引用。你知道吗

此外,您可以在模型定义中声明OutReq.fullfilmentFullfillment的外键,然后简单地分配对象,如下所示

for i in range(5):
    ef = Fulfillment.objects.create(
        ...
        ...
    )
    por = OutReq.objects.create(
        out_req_uid=random.randint(500, 1000000000),
        fulfillment=ef,
        ...
        ...
    )

Django将自动创建一个字段OutReq.fullfilment_id,并将主键存储到Fulfillment实例中。然后你可以像por.fulfillment.id这样访问它

Dango Models如果你正确地使用它们,事情会变得容易得多。你知道吗

我假设每个实现有5个请求。你知道吗

# i assumed you want this is what you intented
for i in range(5):
    ef = Fulfillment.objects.create(
        fullfillment_uid=generateid(),
    )
    for j in range(5):
        por = OutReq.objects.create(
            out_req_uid=random.randint(500, 1000000000),
            fulfillment_uid=ef,
        )



# this is the bulk_create version of the above
fulfillment_list = []
fulfillment_ids = []
for i in range(5):
    ef_id = generateid()
    ef = Fulfillment(                   # note this doesn't create new instance of Fulfillment 
        fullfillment_uid=ef_id,
    )
    fulfillment_list.append(ef)
    fulfillment_ids.append(ef_id)

Fulfillment.objects.bulk_create(fulfillment_list)

req_list = []
for ef in Fulfillment.objects.filter(fullfillment_uid__in=fulfillment_ids):
    for j in range(5):
        por = OutReq(
            out_req_uid=random.randint(500, 1000000000),
            fulfillment_uid=ef,
        )
        req_list.append(por)
OutReq.objects.bulk_create(req_list)

相关问题 更多 >