在整个应用程序中设置on_delete的简便方法

时间:2017-01-10 14:31:31

标签: regex django

我一直在使用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放入我的所有外键中吗?

3 个答案:

答案 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='')
  • 旁注,从emacs粘贴时,我无法删除前面的空白字符。

答案 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 文件进行比较。

快乐编码!!