Обновление поля 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)

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

I get you.

You can handle this using update_or_create inside a loop. Since you're sending multiple JSON objects, you should loop through them and either update or create based on the unique fields (ip, port, type). Here's a simple way to do that:

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)

Explanation:

  1. update_or_create checks if record exists by unique fields (ip, port, type)

  2. If exists – updates created field

  3. Else – creates new object

  4. You don’t need to deal with serializer save here unless you have extra logic

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