Проверять уникальность, пропускать и вводить данные соответствующим образом в Django API

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я хочу создать условие, при котором я беру данные из Google place api. В моей модели place_id есть unique поле. Я создал api, где он принимает несколько данных — примерно так — [{},{},{}] .

Когда я ввожу данные с 2 одинаковыми, place_id это выдает ошибку — "masjid with this place id already exists." .

Вместо этой уникальной ошибки place_id . Я хочу проверить, place_id существует ли уже, тогда не выдавайте ошибку, просто пропустите ее и введите те данные, которые имеют уникальный характер place_id .

Здесь я приведу вам пример, в котором я отправляю данные с помощью json .

 [
    {
        "name": "Jama masjid",
        "address": "XYZ",
        "latitude": 25454.25,
        "longitude": 1541.4,
        "place_id": "place_id" <---- This place_id already exist in database
    },
    {
        "name": "Noor masjid",
        "address": "kondhwa",
        "latitude": 25454.25,
        "longitude": 1541.4,
        "place_id": "place_id1"
    }
]
  

Итак, в ответ он выдает эту ошибку —

 [
    {
        "place_id": [
            "masjid with this place id already exists."
        ]
    },
    {}
]
  

Примечание — я отправляю несколько данных — many=True

Models.py

 class Masjid(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    address = models.CharField(max_length=255, null=True, blank=True)
    place_id = models.CharField(max_length=255, null=True, blank=True, unique=True)
    latitude = models.FloatField(blank=True, null=True)
    longitude = models.FloatField(blank=True, null=True)
  

Views.py

 class MasjidAddGoogleAPIView(generics.CreateAPIView):
    queryset = Masjid.objects.all()
    serializer_class = serializers.MasjidAddGoogleSerialzer
    permission_classes = [IsAuthenticated]

    def list(self, request):
        queryset = self.get_queryset()
        serializer = serializers.MasjidAddGoogleSerialzer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        data = request.data
        print(data)
        if isinstance(data, list):
            serializer = self.get_serializer(data=request.data, many=True)
        else:
            serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  

serilizers.py

 class MasjidAddGoogleSerialzer(serializers.ModelSerializer):
    class Meta:
        model = Masjid
        fields = [
            'name',
            'address',
            'latitude',
            'longitude',
            'place_id'
        ]  
  

Комментарии:

1. я думаю, вы можете использовать for в request.data и сохранять один за другим, как будто у вас нет many=True

2. Да, я пытался сделать то же самое, и это сработало.

Ответ №1:

Я нашел решение. Я повторил список, который был отправлен. Затем я сопоставил поле place_id с базой данных и создал новое list . В соответствии с этим в базу данных были введены новые list данные.

Создайте новый список —

 data_final = [i for i in data if not (Masjid.objects.filter(place_id=i['place_id']).exists() == True)] 
  

Views.py

 class MasjidAddGoogleAPIView(generics.CreateAPIView):
    queryset = Masjid.objects.all()
    serializer_class = serializers.MasjidAddGoogleSerialzer
    permission_classes = [IsAuthenticated]

    def list(self, request):
        queryset = self.get_queryset()
        serializer = serializers.MasjidAddGoogleSerialzer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        data = request.data

        if data:   

            if isinstance(data, list):   

                data_final = [i for i in data if not (Masjid.objects.filter(place_id=i['place_id']).exists() == True)]        

                if data_final:
                    serializer = self.get_serializer(data=data_final, many=True)

                    if serializer.is_valid():
                        serializer.save()
                        return Response(serializer.data, status=status.HTTP_201_CREATED)

            else:
                serializer = self.get_serializer(data=request.data)

                if serializer.is_valid():
                        serializer.save()
                        return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(status=status.HTTP_204_NO_CONTENT)