Поиск REST API с параметрами URL, тестирование работает с некоторыми значениями, но не с другими (все значения являются допустимыми)
Я создаю веб-приложение для поиска в базе данных ваз с помощью Django/react. Я создал представление API, которое принимает параметры URL для поиска записи о вазе. При тестировании вызова API некоторые значения работают как ожидалось, но другие - нет. Вот мой views.py:
class FilterVases(generics.ListAPIView):
serializer_class = VaseSerializer
def get_queryset(self):
queryset = Vase.objects.all()
query_provenance = self.request.query_params.get('provenance_name')
if query_provenance is not None:
try:
provenance = Provenance.objects.get(provenanceName=query_provenance)
queryset = queryset.filter(provenance=provenance)
except:
pass
inscription = self.request.query_params.get('inscription')
if inscription is not None:
queryset = queryset.filter(inscription=inscription)
query_shape = self.request.query_params.get('shape_name')
if query_shape is not None:
try:
shape = Shape.objects.get(shapeName=query_shape)
queryset = queryset.filter(shape=shape)
except:
pass
query_collection = self.request.query_params.get('collection_name')
if query_collection is not None:
try:
collection = Collection.objects.get(collectionName=query_collection)
queryset = queryset.filter(collection=collection)
except:
pass
query_artist = self.request.query_params.get('artist_name')
if query_artist is not None:
try:
artist = Artist.objects.get(artistName=query_artist)
queryset = queryset.filter(artist=artist)
except:
pass
fabric = self.request.query_params.get('fabric')
if fabric is not None:
queryset = queryset.filter(fabric=fabric)
vaseID = self.request.query_params.get('vaseID')
if vaseID is not None:
queryset = queryset.filter(vaseID=vaseID)
return queryset
и мой models.py:
#define shape class
class Shape(models.Model) :
shapeID = models.CharField(max_length=10)
shapeName = models.CharField(max_length=100)
#define artist class
class Artist(models.Model) :
artistID = models.CharField(max_length=10)
artistName = models.CharField(max_length=100)
#define provenance class
class Provenance(models.Model) :
ProvenanceID = models.CharField(max_length=10)
provenanceName = models.CharField(max_length=100)
#define collection class
class Collection(models.Model) :
collectionID = models.CharField(max_length=10)
collectionName = models.CharField(max_length=100)
#define vase class
class Vase(models.Model):
vaseID = models.CharField(max_length=10)
vaseRef = models.CharField(max_length=255,blank=True,null=True)
inscription = models.CharField(max_length=255,blank=True,null=True)
fabric = models.CharField(max_length=100, blank=True,null=True)
subject = models.CharField(max_length=255,blank=True,null=True)
technique = models.CharField(max_length=100,blank=True,null=True)
height = models.FloatField(max_length=100,blank=True,null=True)
diameter = models.FloatField(max_length=100,blank=True,null=True)
shape = models.ForeignKey(Shape, on_delete=models.CASCADE)
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
provenance = models.ForeignKey(Provenance, on_delete=models.CASCADE)
collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
def artist_name(self):
return self.artist.artistName
def collection_name(self):
return self.collection.collectionName
def provenance_name(self):
return self.provenance.provenanceName
def shape_name(self):
return self.shape.shapeName
Несколько примеров тестирования параметров: если я передаю /?collection_name=имя коллекции, я получаю ожидаемый вывод записей, содержащих имя коллекции "имя коллекции". Если я передам /?collection_name=Naples, я получу возврат всех записей в базе данных - unexpected. Если я передам /?artist_name=python, я получу ожидаемую запись, содержащую исполнителя "python". Если я передам /?artist_name=имя исполнителя, я получу ожидаемые записи, содержащие "имя исполнителя". Если я передам /?artist_name=первый художник, я получу все записи в базе данных, возвращенные как неожиданные. Все вышеперечисленные параметры действительны и имеют записи в базе данных, но возвращаются только некоторые. То же самое происходит с параметрами shape_name и provenance_name. Странный и неожиданный результат. Есть ли у кого-нибудь объяснение, что происходит?