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 badges1 Answer
Reset to default 0I 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
本文标签: Update datetime field in bulk save json object Python DjangoStack Overflow
版权声明:本文标题:Update datetime field in bulk save json object Python Django - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744094379a2590014.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论