Обновление поля datetime в массовом сохранении json-объекта Python Django

Я очень плохо разбираюсь в django fw. Я делаю простой django resp api. Я хочу сохранять несколько json объектов в db. Если один из объектов уже существует в db (имеет одинаковые поля), мне нужно просто обновить его с помощью datetime.

Моя модель нравится:

class CheckPort(models.Model):
created = models.DateTimeField(auto_now_add=True)
ip = models.CharField(max_length=15, blank= False)
port = models.PositiveIntegerField(default=0)
type = models.CharField(max_length=5 ,default='tcp')

class Meta:
    ordering = ['created']
    unique_together = ('ip', 'port','type')

Мое мнение:

@api_view(['GET', 'POST'])
def port_list(request):
if request.method == 'GET':
    offers = CheckPort.objects.all()
    serializer = OfferSerializer(offers, many=True)
    return Response(serializer.data)

elif request.method == 'POST':
    serializer = OfferSerializer(data=request.data,many=isinstance(request.data, list))
    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)

Так как же проверить это?

Я понимаю тебя.

Вы можете справиться с этим, используя update_or_create внутри цикла. Поскольку вы отправляете несколько объектов JSON, вам следует выполнить цикл по ним и либо обновить, либо создать на основе уникальных полей (ip, порт, тип). Вот простой способ сделать это:

from django.utils import timezone

@api_view(['GET', 'POST'])
def port_list(request):
    if request.method == 'GET':
        ports = CheckPort.objects.all()
        serializer = OfferSerializer(ports, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        data = request.data
        if not isinstance(data, list):
            data = [data]

        response_data = []
        for item in data:
            obj, created = CheckPort.objects.update_or_create(
                ip=item['ip'],
                port=item['port'],
                type=item.get('type', 'tcp'),
                defaults={'created': timezone.now()}
            )
            response_data.append({
                'ip': obj.ip,
                'port': obj.port,
                'type': obj.type,
                'created': obj.created
            })

        return Response(response_data, status=status.HTTP_200_OK)

Пояснение:

  1. update_or_create проверяет, существует ли запись по уникальным полям (ip, port, type)

  2. Если существует – обновляет created поле

  3. Else – создает новый объект

  4. Здесь вам не нужно иметь дело с сохранением сериализатора, если только у вас нет дополнительной логики

Вернуться на верх