En la API de Google Ads, algunos campos de mensajes se definen como objetos de mensaje vacíos, como campaign.manual_cpm
, o bien solo pueden tener campos opcionales que no necesitan configurarse, por ejemplo, campaign.manual_cpc
. Configurar estos campos es importante a fin de indicarle a la API qué estrategia de ofertas debe usar para la campaña determinada, pero no es intuitivo cuando los mensajes están vacíos.
Cuando se actualiza el campo campaign.name
, que es una string, lo actualizamos directamente como si fuera un atributo de objeto de Python normal:
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 string. También puedes actualizar sus campos directamente:
campaign.manual_cpc.enhanced_cpc_enabled = True
Esto le indicará a la API que esta campaña tiene una estrategia de oferta de manual_cpc
con el CPC avanzado habilitado.
¿Qué sucede si deseas usar manual_cpm
, que está vacío? ¿O manual_cpc
sin habilitar el CPC avanzado? Para ello, deberás copiar una instancia vacía y separada 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)
Observa cómo se especifica manual_cpm
para el objeto campaign
:
name {
value: "Test campaign value"
}
manual_cpm {
}
Se configuró el campo manual_cpm
, pero ninguno de sus campos tiene valores. Cuando envías una solicitud a la API que usa este patrón, puedes habilitar el registro y, luego, inspeccionar la carga útil de la solicitud para verificar que estás configurando el objeto de mensaje vacío correctamente.
Por último, deberás agregar este campo de forma manual al objeto update_mask
del objeto de solicitud. El asistente 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 campo que no se configuró.
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")