Массовый GET в Django REST Framework
Я создаю приложение, используя Django и Django REST Framework. Я достаточно хорошо разбираюсь в базовом Django, но в DRF я совсем новичок. Надеюсь, что кто-нибудь сможет помочь мне с нижеприведенными вопросами.
У меня есть список словарей, которые я хочу отправить через мой API в виде одного вызова, а не последовательно отправлять request.get
вызовы, скажем, в цикле (утомительно медленно, слишком много обращений к базе данных и т.д.)
Я создал список и сериализовал его в JSON, который теперь выглядит примерно так:
[
{
"kingdom":"Plantae",
"phylum":"Tracheophyta",
"class_taxonomic":"Magnoliopsida",
"order":"Apiales",
"family":"Apiaceae",
"genus":"Heracleum",
"species":"mantegazzianum",
"taxon_rank":"SPECIES"
},
{
"kingdom":"Plantae",
"phylum":"Bryophyta",
"class_taxonomic":"Bryopsida",
"order":"Orthotrichales",
"family":"Orthotrichaceae",
"genus":"Zygodon",
"species":"viridissimus",
"taxon_rank":"SPECIES"
},
{
"kingdom":"Plantae",
"phylum":"Tracheophyta",
"class_taxonomic":"Magnoliopsida",
"order":"Caryophyllales",
"family":"Polygonaceae",
"genus":"Fallopia",
"species":"japonica",
"taxon_rank":"SPECIES"
}
]
Возможно ли передать этот список моей модели (taxonData
) и вернуть те экземпляры модели, если они присутствуют в вышеуказанном списке? Если да, то каким способом лучше всего этого добиться? Нужно ли мне использовать generics.ListAPIView
и пользовательский метод get_queryset
? Если я попробую сделать это со следующим кодом:
# models.py
class TaxonData(models.Model):
kingdom = models.CharField(max_length=64, blank=True, null=True)
phylum = models.CharField(max_length=64, blank=True, null=True)
class_taxonomic = models.CharField(max_length=64, blank=True, null=True)
order = models.CharField(max_length=64, blank=True, null=True)
family = models.CharField(max_length=64, blank=True, null=True)
genus = models.CharField(max_length=64, blank=True, null=True)
species = models.CharField(max_length=64, blank=True, null=True)
taxon_rank = models.CharField(max_length=64)
class Meta:
unique_together = (( "kingdom", "phylum", "class_taxonomic",
"order", "family", "genus", "species"),)
# serializers.py
class taxonDataSerializer(serializers.ModelSerializer):
class Meta:
model = TaxonData
fields = '__all__'
# views.py
class taxonDataListViewSet(generics.ListAPIView):
serializer_class=taxonDataSerializer
Я получаю ошибку в консоли, говорящую:
AttributeError: type object 'taxonDataListViewSet' has no attribute 'get_extra_actions'
Я должен признать, что немного заблудился в документации DRF, я не могу увидеть путь через нее в данный момент.
Импортируйте APIView из rest_framework.views в ваш views.py. Создайте пост-запрос и передайте этот список в качестве данных. Выполните итерацию данных и создайте ответ. Вот способ, как вы можете это сделать.
from rest_framework.response import Response
from rest_framework.views import APIView
class TaxonDataAPIView(APIView):
def post(self, request, *args, **kwargs):
data = self.request.data
response = {}
for row in data:
try:
obj = TaxonData.objects.get(kingdom=row['kingdom'], phylum=row['phylum'], class_taxonomic=row['class_taxonomic'], order=row['order'], family=row['family'], genus=row['genus'], species=row['species'], taxon_rank=row['taxon_rank'])
# do whatever you want to do with this obj and make the response
except:
# do what you want if the list item does not exist in database
return Response(response)