我有两个相关的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` 在另一个上下文中,我希望级联行为可以工作。我能做什么?是否有一个批量更新函数可以执行表的非破坏性更新?
2条答案
按热度按时间eqzww0vc1#
添加
@transaction.atomic
装饰器,并使用save()
方法您将有一个“批处理”更新,而不需要删除item表。来源
jhiyze9q2#
您可以逐个更新项目: