Django,python 2.7:将多个记录插入两个相关的表中

时间:2018-11-30 19:21:49

标签: python django

Django Orm的新手,我需要指导:

我想在表'Table1'和PK'table1Primary'中插入5条记录

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

示例:表1主键

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

表2外键

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

[我宁愿使用bulk_create或任何其他优化的方法,而不是编写单独的插入语句]

代码行不通,我想是因为这一行
 eft_fulfillment_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()

2 个答案:

答案 0 :(得分:0)

如果要为每个OutReq对象保存一个新的Fulfillment对象,请在同一循环中进行操作。否则,您将仅使用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如果正确使用它们会使事情变得容易得多。

答案 1 :(得分:0)

我假设每个实现都有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)