这里我有4个字段需要使用外键,那么在调取数据的时候就可以使用两个'_'进行调取,当然条件必须需要从前端传进来
models.py
class HostInfo(models.Model): host_ip = models.GenericIPAddressField() usage = models.ForeignKey('ServiceLine') sysversion = models.ForeignKey('SystemVersion') sysuser = models.ForeignKey('SystemUser') proposer = models.CharField(max_length=20) dataversion = models.ForeignKey('DataBaseVersion') tomversion = models.ForeignKey('TomcatVersion')
调用的时候需要了解的是:1、使用values进行调用返回的是valueQuerySet字段,而浊QuerySet,所以先转成list然后再使用json.dumps转成json
2、使用filter进行调用返回在是QuerySet对象,那么就可以直接使用serializers.serialize() 方法转化为json
def search(request): keyword = request.GET.get('keyword', None) if keyword: obj = models.HostInfo.objects.filter(host_ip=keyword).values('host_ip', 'usage__serviceline', 'sysversion__systemversion', 'sysuser__systemuser', 'dataversion__databaseversion', 'tomversion__tomcatversion', 'proposer', 'id' ) # obj = models.HostInfo.objects.filter(host_ip=keyword) # data = serializers.serialize('json', obj) data = json.dumps(list(obj)) return HttpResponse(data)
前端在拿到json对象后就可以使用字符串或者遍历的方式进行前端的显示
<script> $("#search_btn").click(function () { $.ajax({ url:'/cmdb/search', type:'GET', data:$("#search_input").serialize(), dataType:'json', success: function (response,stutas,xhr) { $('#tb').empty(); $.each(response, function (i, item) { var vfields = item; //这里不定义也行,在下面的调用中直接使用item,请忽略我不规范的缩进 $("tbody").append("<tr>" + "<td>" + i + "</td>" + "<td>" + vfields.host_ip +"</td>" + "<td>" + vfields.usage__serviceline + "</td>" + "<td>" + vfields.sysversion__systemversion + "</td>" + "<td>" + vfields.sysuser__systemuser + "</td>" + "<td>" + vfields.proposer + "</td>" + "<td>" + vfields.dataversion__databaseversion + "</td>" + "<td>" + vfields.tomversion__tomcatversion + "</td>" + "<td>" + "<a " + "href='/cmdb/edit-" + vfields.id + "'>编辑</a>" + "|" + "<a href='/cmdb/delete-" + vfields.id + "'>删除</a>" + "</td>" + "</tr>"); }) } }); }); </script>