плохая производительность для цикла с экземпляром и массовым созданием

#python-3.x #django #django-views

#python-3.x #джанго #джанго-просмотры

Вопрос:

Мне нужно использовать bulk_create, чтобы создать много «деталей»(деталей), проблема в том, что мне нужно повторить через json, чтобы получить аргументы, и у меня есть 4 fk, поэтому django просит у меня экземпляр, а не идентификатор. но чтобы иметь идентификатор, мне нужно сделать .get (), поэтому у меня плохая производительность, потому что ее 4 получает на каждой итерации.

есть ли способ получить все экземпляры объектов и поместить их в список или что-то еще, чтобы выполнить загрузку, а затем экземпляр без использования get каждый раз?

 class DetalleFichaAllViewSet(viewsets.ModelViewSet): serializer_class = DetalleFichaUpdateAllSerializer  def create(self, request, *args, **kwargs):  user = self.request.user  data = request.data  try:  ficha = Ficha.objects.get(autor=user.id)  DetalleFicha.objects.filter(ficha=ficha.id).delete()    except Http404:  pass   # Create Ficha  now = datetime.now()  date_time = now.strftime("%Y-%m-%d %H:%M")  print("AAAAAA DATA:", data)  Ficha.objects.filter(autor=user.id).update(fecha_creacion=date_time, autor=user,  nombre=data["nombreFicha"], descripcion=data["descripcionFicha"])   ficha = Ficha.objects.filter(autor=user.id).last()  recintos = Recinto.objects.all()  productos = Producto.objects.all()  estandar_productos = EstandarProducto.objects.all()  cotizaciones = Cotizacion.objects.all()  detalles_ficha = []    for detalle in data["detalles"]:  recinto = recintos.get(id=detalle[1])  producto = productos.get(id=detalle[10])  estandar_producto = estandar_productos.get(id=detalle[9])  try:  cotizacion = cotizaciones.get(id=detalle[4])  except ObjectDoesNotExist:  cotizacion = None  print("Fecha: ", detalle[8])  detalle = DetalleFicha(carreras=detalle[0],  recinto=recinto, nombre=detalle[2],  cantidad_a_comprar=detalle[3], cotizacion=cotizacion,  valor_unitario=detalle[5], valor_total=detalle[6],  documento=detalle[7], fecha_cotizacion=detalle[8],  estandar_producto=estandar_producto, producto=producto,  ficha=ficha)  detalles_ficha.append(detalle)  DetalleFicha.objects.bulk_create(detalles_ficha)   print("Array convertida", detalles_ficha)  print(detalles_ficha[0])  return Response(status=status.HTTP_200_OK)  

Комментарии:

1. Вы можете повторить данные, чтобы создать списки нужных вам идентификаторов, а затем выполнить запрос для всех объектов с этими идентификаторами. Затем повторите данные еще раз, чтобы создать свои объекты и извлечь объекты из наборов запросов. Это может быть немного более эффективным, чем нынешний подход.

2. Спасибо! я попробую это сделать и опубликую результаты!