pythonjsondjango

Update datetime field in bulk save json object Python Django


i am very bad in django fw. I make simple django resp api. I want to save multiple json object to db. If one of objects is already exist in db(has the same uniq fields) i need just to update filed with datetime.

My Model Like:

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

My view:

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

So how to validate this?


Solution

  • 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