Массовый 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)
Вернуться на верх