17-在django中根据前端传来的字符串找对应的app和model(get_model)并更新model的字段(反射)

原文:https://www.jianshu.com/p/6e3c451880c5

表名,字段,新的值都是前端传来的。

首先通过表名变量获取model,使用get_model方法

接着通过id获取要更新的记录obj

然后使用setattr(obj, fieldname,fieldvalue)函数给记录更新字段值。

这样就避免了后端写一些重复的更新字段语句。

上代码

#目前django是1.8版本,1.9以后导入get_model方法有更改
try:
    from django.apps import apps
    get_model=apps.get_model
except ImportError:
    from django.db.models.loading import get_model


def editTableInfo(request):
    if request.method =='POST':
        try:
            editType = request.POST.get('editType', None)
            newValue = request.POST.get('newValue', None)
            objId = request.POST.get('objId', None)
            tableName = request.POST.get('tableName',None)
            tableModel = get_model('inzhua_main', tableName)
            obj = tableModel.objects.get(id=objId)
            result = dynamicUpdateObjFields(obj=obj, fieldName=editType,
                                            fieldValue=newValue)
            return HttpResponse(result)
        except Exception as e:
            print(e)
            return HttpResponse('网络出错!')

def dynamicUpdateObjFields(obj=None,fieldName=None,fieldValue=None):
    print obj,fieldName,fieldValue
    try:
        if obj and fieldName and fieldValue:
            setattr(obj,fieldName,fieldValue)
            obj.save()
            return '修改成功'
    except Exception as e:
        print e
    return '修改失败'

  

 

django1.6, 通过字符串和get_app、get_model获得对应的object

只需要两行代码:
from django.db.models import get_model
get_model('auth', 'User')

下面是详细的过程展示:

>>> from django.db.models import get_app, get_models, get_model
# auth是django自带的app, get_app需要一个参数:app_name
>>> get_app('auth')        
<module 'django.contrib.auth.models' from '/opt/project/easyui/lib/python2.7/site-packages/django/contrib/auth/models.pyc'>
>>> app = get_app('auth')
# 获得一个app的所有model
>>> get_models(app)   
[<class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.User'>

# 下面两种方式,得到的User是一样的, get_model需要两个参数,app_name和model_name
>>> get_model('auth', 'User')
<class 'django.contrib.auth.models.User'>
>>> from django.contrib.auth.models import User
>>> User
<class 'django.contrib.auth.models.User'>
>>> get_model('auth', 'User') == User
True
>>> u = get_model('auth', 'User')   
>>> u.objects.all()[0]
<User: root>

django1.7, 可以使用上面的方法,也可以用新增加的django.apps来获取

>>> from django.apps import apps
>>> apps.get_app_config('auth') 
<AuthConfig: auth>
# 注意得到的结果是迭代器(iterator)
>>> auth = apps.get_app_config('auth')
>>> auth.get_models()
<generator object get_models at 0x31422d0>
>>> for i in auth.get_models():
...  print i
... 
<class 'django.contrib.auth.models.Permission'>
<class 'django.contrib.auth.models.Group'>
<class 'django.contrib.auth.models.User'>
>>> auth.get_model('User')         
<class 'django.contrib.auth.models.User'>
>>> User = auth.get_model('User')
>>> User.objects.all()[0]
<User: root>

注意,django1.7之前的版本没有django.apps

>>> import django
>>> django.get_version()
'1.6.5'
>>> from django.apps import apps
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named apps

参考:

https://www.cnblogs.com/xupeiyuan/p/get_model_by_string.html

https://stackoverflow.com/questions/4881607/django-get-model-from-string

posted @ 2019-08-26 15:28  番茄土豆西红柿  阅读(94)  评论(0)    收藏  举报
TOP