繁体   English   中英

单个 id 的 REST API 端点调用在按名称调用时给出具有相似开头字母的其他 id 结果

[英]REST API endpoint call of a single id gives other id results with similar begining alphabtes when called by name

我正在学习 REST API Django 并感谢您在理解以下情况方面的帮助。

myproject/abcapp/forms.py

from django import forms
from .models import *

class ProfileForm(forms.ModelForm):
    class Meta:
        model=Profile
        fields = "__all__"
       
  
class Zoo_data_2020Form(forms.ModelForm):
    class Meta:
        model=Zoo_data_2020
        fields = "__all__"

myproject/abcapp/models.py

from django.conf import settings
from django.db import models


class ProfileQuerySet(models.QuerySet):
    pass

class ProfileManager(models.Manager):
    def get_queryset(self):
        return ProfileQuerySet(self.model,using=self._db)


class Profile(models.Model):
    name=models.CharField(settings.AUTH_USER_MODEL,max_length=200) 
    subtype=models.CharField(max_length=500)
    type=models.CharField(max_length=500)
    gender=models.CharField(max_length=500)
  
    objects = ProfileManager()

    class Meta:
        verbose_name = 'Profile'
        verbose_name_plural = 'Profiles'

        managed = False
        db_table ='profiles'

    def __str__(self):
        return '{}'.format(self.name)
          
      
class Zoo_data_2020QuerySet(models.QuerySet):
    pass
  
class Zoo_data_2020Manager(models.Manager):
    def get_queryset(self):
        return Zoo_data_2020QuerySet(self.model,using=self._db)

class Zoo_data_2020(models.Model):
    name=models.CharField(max_length=200)
    size=models.DecimalField(decimal_places=3,max_digits=100000000)
    weight=models.DecimalField(decimal_places=3,max_digits=100000000)
    age=models.DecimalField(decimal_places=3,max_digits=100000000)
    
    objects = Zoo_data_2020Manager()

    class Meta:
        verbose_name = 'zoo_data_2020'
        verbose_name_plural = 'zoo_data_2020s'

        managed = False
        db_table ='zoo_data_2020'

    def __str__(self):
        return '{}'.format(self.name)

myproject/abcapp/api/views.py

from rest_framework import generics, mixins, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
import json
from abcapp.models import *
from .serializers import *


def is_json(json_data):
    try:
        real_json = json.loads(json_data)
        is_valid = True
    except ValueError:
        is_valid = False
    return is_valid


class ProfileDetailAPIView(generics.RetrieveAPIView):
    
    permission_classes = []
    authentication_classes = []
    queryset= Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'id'


class ProfileAPIView(generics.ListAPIView):
    permission_classes = []
    authentication_classes= []
    serializer_class = ProfileSerializer

    passed_id = None
    search_fields = ('id','name','animal')
    queryset = Profile.objects.all()


    def get_queryset(self):
        qs = Profile.objects.all()
        query = self.request.GET.get('q')
        if query is not None:
            qs=qs.filter(name__icontains=query)
        return qs


  
class Zoo_data_2020DetailAPIView(generics.RetrieveAPIView):
    
    permission_classes = []
    authentication_classes = []
    queryset= Zoo_data_2020.objects.all()
    serializer_class = Zoo_data_2020Serializer
    lookup_field = ('id','name')
 

class Zoo_data_2020APIView(generics.ListAPIView):
    permission_classes =[]
    authentication_classes= []
    serializer_class = Zoo_data_2020Serializer

    passed_id = None
    search_fields = ('id','name')
    queryset = Zoo_data_2020.objects.all()


    def get_queryset(self):
        qs = Zoo_data_2020.objects.all()
        query = self.request.GET.get('q')
        if query is not None:
            qs=qs.filter(name__icontains=query)
        return qs

myproject/abcapp/api/serializers.py

from rest_framework import serializers 
from abcapp.models import *
 
class ProfileSerializer(serializers.ModelSerializer):
     class Meta:
        model=Profile
        fields = "__all__"
        
        read_only_fields = ['name']

class Zoo_data_2020Serializer(serializers.ModelSerializer):
     class Meta:
        model = Zoo_data_2020
        fields = "__all__"
        
        read_only_fields = ['name']

因此,当我致电http://127.0.0.1:8000/api/zoodata2020/?search=AKE时,它会为我提供有关AKE的信息以及有关名称AKELA的信息,该名称也在zoodata2020表中。 怎么做才能让我只获得有关AKE的信息?

[
    {
        "id": 7,
        "name": "AKE",
        "subtype": "beaver",
        "type": "arctic",
        "gender": "female",
   
       
    },
    {
        "id": 19,
        "name": "AKELA",
        "subtype": "wolf",
        "type": "arctic",
        "gender": "male",
   
       
    }
]

所以我只需要 id 7而不是19 ,而且我按name打电话。 当我通过http://127.0.0.1:8000/api/zoodata2020/?search=24调用时,同样的问题列出了我的 id 24,224,2424 即使我调用.../?search=24,24虽然它应该返回:

HTTP 404 Not Found
Allow: GET, HEAD, OPTIONS
Content-Type: application/json

{
   "detail": "Not found."
}

但事实并非如此。 我需要在哪里看,我需要修复什么以及如何修复。

因此尝试将qs=qs.filter(name__icontains=query)更改为qs=qs.filter(name__exact=query)但仍然无法正常工作。

如果您能帮助理解它,将不胜感激。

qs=qs.filter(name__icontains=query)行执行模式匹配过滤。 如果您需要精确过滤,请使用__exact后缀而不是__contains

qs=qs.filter(name__exact=query)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM