【问题标题】:Django: Unsupported lookup 'case_exact' for CharField or join on the field not permittedDjango:CharField 的不支持查找“case_exact”或不允许加入该字段
【发布时间】:2018-12-10 07:13:45
【问题描述】:

这是我的服务器上的 GET 请求。

 HTTP GET /testPage/?persona_name=Aman&key_name=country&key_label=My+Country&key_value=India&Save=Submit 500

在这个视图的帮助下,我正在从 GET 请求中获取值。

def PersonaSave(request):
    persona_name = request.GET.get('persona_name',)
    persona_key = request.GET.get('key_name',)
    persona_key_value = request.GET.get('key_value',)
    persona_key_label = request.GET.get('key_label',)
    persona_submit = request.GET.get('Save',)
    return( persona_name , persona_key , persona_key_label , persona_key_value , persona_submit

下面是我正在检查具有给定角色名称的对象是否存在的功能。如果它存在,那么我正在更新值,如果它是一个新角色,那么我正在制作新的 testPersona 对象。

def TestPageView(request):
    x=PersonaSave(request)
    persona_name = x[0]
    persona_key = x[1]
    persona_key_label=x[2]
    persona_key_value=x[3]
    persona_submit=x[4]
    testPersonaName = TestPersonaName(name=persona_name)
    testPersonaName.save()

    if(persona_name is None and persona_key is None and persona_key_label is None and persona_key_value is None):
        return render(request, 'dashboard/test_page.html')

 # Below is the function for updating testPersona . 

    elif TestPersonaName.objects.filter(name__case_exact=persona_name).exists():
        testpersona = TestPersona.objects.get(name__case_exact=persona_name)
        if testpersona.key == persona_key:
            testpersona.label= persona_key_label
            testpersona.value = persona_key_value
            testpersona.save()




#If persona with new name is detected then saving a new testPersona object.
      testpersona=TestPersona(name=persona_name,key=persona_key,label=persona_key_label,value=persona_key_value)
        testpersona.save()

        return render(request,'dashboard/test_page.html')

以下是我得到的错误。

    django.core.exceptions.FieldError: Unsupported lookup 'case_exact' for CharField or join on the field not permitted.

Below are TestPersona and TestPersonaName models.

    class TestPersonaName(models.Model):
        name = models.CharField(max_length=100,null=True)
        def __str__(self):
            return self.name

    class TestPersona(models.Model):
        name = models.ForeignKey('TestPersonaName',null=True)
        key  = models.CharField(max_length=200,null=True,blank=True)
        label = models.CharField(max_length=200,null=True,blank=True)
        value = models.CharField(max_length=200,null=True,blank=True)
        def __str__(self):
            return self.name + " " + self.key

请您解释一下为什么我会收到此错误以及如何删除此错误?提前致谢。

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    您应该在精确字段名称和模型字段名称之间使用 2 个下划线

    假设您正在匹配名为 persona_name

    的字段
    elif TestPersonaName.objects.filter(persona_name__iexact=persona_name).exists():
        testpersona = TestPersona.objects.get(persona_name__iexact=persona_name)
    

    iexact 匹配值,不区分大小写。

    【讨论】:

      【解决方案2】:

      改变这一行

       testpersona = TestPersona.objects.get(name__case_exact=persona_name)
      

       testpersona = TestPersona.objects.get(name__name__case_exact=persona_name)
      

      【讨论】:

      • 对于这行代码 elif TestPersonaName.objects.filter(name__name__case_exact=persona_name).exists,我现在收到以下错误“CharField 的不支持查找 'name' 或不允许加入该字段” ():
      • 不,那将是TestPersonaName.objects.filter(name__case_exact=persona_name).exists() 不要更改此行
      • 好吧,我按照你说的做了,但是我得到了同样的错误 Unsupported lookup 'case_exact' for CharField or join on the field not allowed.
      • 我非常感谢@Exprator,您花时间帮助我。
      • 将此行 TestPersonaName.objects.filter(name__case_exact=persona_name).exists() 更改为 TestPersona.objects.filter(name__case_exact=persona_name).exists()
      【解决方案3】:

      在这个问题上花了一整天后,我终于知道我在哪里做错了。

      在TestPersona 模型中,有一个字段'name',它是模型TestPersonaName 的外键。这意味着TestPersonaName 的对象将被分配给TestPersona 的'name' 字段。所以答案是:

      def TestPageView(request):
          x=PersonaSave(request)
          persona_name = x[0]
          persona_key = x[1]
          persona_key_label=x[2]
          persona_key_value=x[3]
          persona_submit=x[4]
      
          if(persona_name is None and persona_key is None and persona_key_label is None and persona_key_value is None):
      
          # Since no paramteres are persent in GET request(i.e Nothing is filled in form), then we will simply render the blank form.
              return render(request, 'dashboard/test_page.html')
      
       #  Below is the function for updating testPersona . 
      
          elif TestPersonaName.objects.filter(name__iexact=persona_name).exists():
              testPersonaName_obj = TestPersonaName.objects.filter(name__iexact=persona_name) #Fetching an object from TestPersonaName model where name = persona_name
              testpersonaSet = TestPersona.objects.filter(name=testPersonaName_obj) #Passing testPersonaName_obj to 'name' field of TestPersona model because name is foreign key.
              for testpersona in testPersonaSet: #testPersonaSet is a QuerySet
                  if testpersona.key == persona_key: #Checking whether persona with given key is already present or not
      
               # If TestPersona object with given name and give key is already present then we will update the details instead of making a new object.
                      testpersona.label= persona_key_label 
                      testpersona.value = persona_key_value
                      testpersona.save()
                      return render(request,'dashboard/test_page.html')    
      
      #If persona with new name is detected then saving new objects of TestPersonaName and TestPersona object.
          testPersonaName = TestPersonaName(name=persona_name)
          testPersonaName.save() 
          testpersona(name=testPersonaName,key=persona_key,label=persona_key_label
                      ,value=persona_key_value)
          testpersona.save()
          return render(request,'dashboard/test_page.html')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-26
        • 2019-06-01
        • 1970-01-01
        • 2018-08-04
        • 2022-08-03
        • 2021-01-13
        • 2019-05-27
        • 1970-01-01
        相关资源
        最近更新 更多