[英]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.