#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)