admin管理员组

文章数量:1394585

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?

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?

Share Improve this question asked Mar 27 at 11:04 Gosha EfimenkoGosha Efimenko 655 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

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

本文标签: Update datetime field in bulk save json object Python DjangoStack Overflow