Cómo configurar objetos de mensaje vacíos como campos

En la API de Google Ads, algunos campos de mensaje se definen como objetos de mensaje vacíos. como campaign.manual_cpm, o pueden tener solo campos opcionales que no necesitan establecerse, por ejemplo, campaign.manual_cpc Configurar estas opciones es importante para indicarle a la API qué estrategia de ofertas usar Campaña, pero no es intuitiva cuando los mensajes están vacíos.

Cuando actualices el campo campaign.name, que es una cadena, configuramos el campo actualizándolo directamente como si fuera un atributo normal del objeto de Python:

campaign.name = "Test campaign value"

campaign.manual_cpc es un campo anidado, lo que significa que contiene otro mensaje protobuf y no un tipo primitivo, como una cadena. Tú también puede actualizar sus campos directamente:

campaign.manual_cpc.enhanced_cpc_enabled = True

Esto indicará a la API que esta campaña tiene una estrategia de oferta de manual_cpc con el CPC avanzado habilitado.

Pero ¿qué sucede si deseas usar manual_cpm, que está vacío? O manual_cpc sin habilitar el CPC mejorado? Para ello, deberás copiar una copia separada instancia vacía de la clase en la campaña, por ejemplo:

client = GoogleAdsClient.load_from_storage()

empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)

Ten en cuenta cómo se especifica manual_cpm para el objeto campaign:

name {
  value: "Test campaign value"
}
manual_cpm {
}

El campo manual_cpm está configurado, pero ninguno de sus campos tiene valores. Al enviar solicitud a la API que usan este patrón, puedes verificar que estás configurando el objeto de mensaje vacío de forma correcta habilitando logging e inspeccionando la carga útil de la solicitud.

Por último, deberás agregar manualmente este campo al objeto de la update_mask El ayudante de máscara de campo no tiene un mecanismo para determinar la diferencia entre un campo que se configuró explícitamente como un objeto vacío y un que no se ha establecido.

from google.api_core.protobuf_helpers import field_mask

campaign_operation.create = campaign
campaign_operation.update_mask = field_mask(None, campaign)
# Here we manually add the "manual_cpm" field
campaign_operation.update_mask.append("manual_cpm")