python—使用django orm更新表而不删除关系

fafcakar  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(391)

我有两个相关的django模型

class Item(models.Model):
    item_nbr = models.IntegerField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True)
    item_nbr_desc = models.CharField(max_length=155)

class SetItem(models.Model):
    set_id = models.CharField(primary_key=True, default='', max_length=12)
    set_nbr = models.IntegerField()
    items = models.ForeignKey(Item)

我(定期)运行一个脚本来读取 Item 表,并使用该Dataframe更新django数据库项表。我正在使用django orm框架来创建与django数据库的接口 script.py ```
from app.models import Item

item_table = pd.read_sql(__)
item_table = some_transformations(item_table.copy())

I remove all the Items that will be updated

Item.objects.filter(item_nbr__in=item_table.item_nbr.unique()).delete()
item_table_records = item_table.to_dict('records')
item_instances = []
fields = item_table.keys()
for record in item_table_records:
kwargs = {
field: record[field] for field in fields
}
item_instances.append(Item(**kwargs))
Item.objects.bulk_create(item_instances) # update the new rows

问题是 `setItem` 每次我删除相关项时,表都会被删除(因为 `on_delete=models.CASCADE` 行为)。我想更新 `items` 不删除 `setItem` 相关行,我不想更改 `on_delete` 默认行为,因为只有在这个脚本中我需要上传一个完整的表,它可能是我想删除一个 `Item` 在另一个上下文中,我希望级联行为可以工作。我能做什么?是否有一个批量更新函数可以执行表的非破坏性更新?
eqzww0vc

eqzww0vc1#

添加 @transaction.atomic 装饰器,并使用 save() 方法您将有一个“批处理”更新,而不需要删除item表。

from django.db import transaction

@transaction.atomic
def item_update(item_table):
    items_by_pk = Item.objects.in_bulk(item_table.item_nbr.values)
    for record in item_table.to_dict('records'):
        item = items_by_pk[record['item_nbr']]
        for field, value in record:
           setattr(item, field, value)
        item.save()

来源

jhiyze9q

jhiyze9q2#

您可以逐个更新项目:

items_by_pk = Item.objects.in_bulk(item_table.item_nbr.values)
for record in item_table.to_dict('records'):
    item = items_by_pk[record['item_nbr']]
    for field, value in record:
        setattr(item, field, value)
    item.save()

相关问题