我一直在使用Python的-Wd
参数,并发现吨我需要做的更改才能准备升级到Django 2.0
python -Wd manage.py runserver
主要的是on_delete
将成为必需的论点。
RemovedInDjango20Warning:on_delete将是Django 2.0中ForeignKey的必需arg。如果要保持当前的默认行为,请在模型和现有迁移中将其设置为
models.CASCADE
。请参阅https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ForeignKey.on_delete
我可以使用一个简单的正则表达式(或方法)将on_delete
放入我的所有外键中吗?
答案 0 :(得分:4)
您可以使用
(ForeignKey|OneToOneField)\(((?:(?!on_delete|ForeignKey|OneToOneField)[^\)])*)\)
这将搜索当前尚未定义删除时发生的所有外键,并且还会忽略覆盖ForeignKey的任何地方。
然后它将捕获括号内的任何内容,允许您使用捕获组和on_delete
替换内部文本$1($2, on_delete=models.CASCADE)
建议不要使用上述内容替换所有内容,并且您仍应单步执行以确保不会出现任何问题(例如任何pep8行长警告)
答案 1 :(得分:1)
我必须这样做,并且Sayse的解决方案有效
import re
import fileinput
import os, fnmatch
import glob
from pathlib import Path
# https://stackoverflow.com/questions/41571281/easy-way-to-set-on-delete-across-entire-application
# https://stackoverflow.com/questions/11898998/how-can-i-write-a-regex-which-matches-non-greedy
# https://stackoverflow.com/a/4719629/433570
# https://stackoverflow.com/a/2186565/433570
regex = r'(.*?)(ForeignKey|OneToOneField)\(((?:(?!on_delete|ForeignKey|OneToOneField)[^\)])*)\)(.*)'
index = 0
for filename in Path('apps').glob('**/migrations/*.py'):
print(filename)
=> filename = (os.fspath(filename), ) # 3.6 doesn't have this
for line in fileinput.FileInput(filename, inplace=1):
a = re.search(regex, line)
if a:
print('{}{}({}, on_delete=models.CASCADE){}'.format(a.group(1), a.group(2), a.group(3), a.group(4)))
else:
print(line, end='')
答案 2 :(得分:0)
我制作了这个 bash 脚本,可能会对您有所帮助。
#!/bin/bash
FK=()
IFS=$'\n'
count=0
for fk in $(cat $1 | egrep -i --color -o 'models\.ForeignKey\((.*?)');
do
FK[$count]=$fk
#FK+=$fk
count=$(($count + 1))
done
for c in "${FK[@]}";
do
r=`echo "${c}" | sed -e 's/)$/,on_delete=models.CASCADE)/g'`
a="${c}"
sed -i "s/${c}/${r}/g" $1
done
也许您想要一种更“保存”的方法,将 sed -i
更改为 sed -e
,并将输出重定向到一个文件,以便与您的原始 models.py 文件进行比较。
快乐编码!!