Django InvalidQuery error with objects.raw()



in/crms/cust/cust_popup/invalidquery/原始查询必须包括主键

发生错误。您如何处理?

请求方法:发布
请求URL:http://192.168.91.170:55555555555555555555555555555555555555555555555555555555555555555555.5555号 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>

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

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

您在此处选择一个true/false,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。请参阅此处的文档

.exists()返回布尔值,因此您可能需要调整序列化器来考虑。

最新更新