与objects.raw()的Django InvalidQuery错误

时间:2018-03-28 00:48:59

标签: python ajax django

/ crms / cust / cust_popup /中的无效查询 原始查询必须包含主键

发生错误。你是如何处理的?

请求方法:POST
请求网址:http://192.168.91.170:55555/crms/cust/cust_popup/
    Django版本:1.11.1
    Python可执行文件:/ home / sweetyxyz / dev / web / myvenv / bin / python
    Python版本:3.4.3

我的源代码是.....

models.py

    class Cu_00(models.Model):
       cu_code = models.CharField(primary_key=True, unique=True, max_length=50)
       cu_nm = models.CharField(db_index=True, max_length=100)
       cu_addr = models.CharField(max_length=200,null=True)
       cu_memo = models.TextField(max_length=2000,null=True)
       cu_comp_yn = models.CharField(max_length=2,null=True) 
       cu_use_yn = models.CharField(max_length=2, null=True)
       cu_del_yn = models.CharField(max_length=2, default='N' )
       createDate = models.DateTimeField(auto_now_add=True)
       def __str__(self):
           return self.cu_nm

urls.py

    ....

    url(r'^cust/cust_popup/$' , views_cu.isCustData, name='isCustData' ) ,

    .....

views.py

    def isCustData(req):

        if req.method == 'POST':
           cCust_nm = req.POST['cust_nm']
        else:
           cCust_nm = req.GET.get['cust_nm']

        cCust_nm = '%'+cCust_nm+'%'
        cDel_yn = 'N'

        cQuery = "select exists( select * from crmtotal_cu_00 where cu_nm like %s and cu_del_yn = %s )"
        events = Cu_00.objects.raw(cQuery, [cCust_nm, cDel_yn])
        context = {}

        events = serializers.serialize('json', events)
        context['is_taken'] = events

        return JsonResponse(data=serializers.serialize('json', events))

html源代码

    ....
    <script>
    $("#cust_nm").change(function(){
      var cust_nm = $("#cust_nm").val() ;
      console.log(cust_nm) ;

      $.ajaxSetup({
        data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
      });

      $.ajax({
              url: "{% url 'isCustData' %}",
              type : 'POST' ,
              data: {
                'cust_nm': cust_nm
              },
              dataType: 'json',
              success: function (data) {
                if (data.is_taken) {
                  alert("Cust Name is Found");
                }
              }
            });
       })
       </script>

1 个答案:

答案 0 :(得分:0)

raw()的调用中使用该查询没有意义。

cQuery = "select exists(
    select * from crmtotal_cu_00 where cu_nm like %s and cu_del_yn = %s
)"

你在这里选择了一个真/假,raw()应该如何将它变成一个可迭代的对象实例?

您可以使用Django的ORM重新创建查询,而无需直接使用SQL。

如果您从代码中删除此行:

cCust_nm = '%'+cCust_nm+'%'

然后这应该给你你想要的东西:

Cu_00.objects.filter(cu_nm__contains=cCust_nm, cu_del_yn='N').exists()

根据cu_nm包含的内容以及您尝试选择的内容,您可能需要使用__icontains代替__contains。请参阅文档here

.exists()会返回一个布尔值,因此您可能需要调整序列化程序以解决此问题。