Обновление поля 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:
update_or_create
checks if record exists by unique fields (ip
,port
,type
)If exists – updates
created
fieldElse – creates new object
You don’t need to deal with serializer save here unless you have extra logic