Impostazione di oggetti messaggio vuoti come campi

Nell'API Google Ads alcuni campi dei messaggi sono definiti come oggetti di messaggio vuoti, ad esempio campaign.manual_cpm, oppure possono includere solo campi facoltativi che non devono essere impostati, ad esempio campaign.manual_cpc. L'impostazione di questi campi è importante per indicare all'API la strategia di offerta da utilizzare per la campagna in questione, ma non è intuitivo quando i messaggi sono vuoti.

Quando aggiorniamo il campo campaign.name, che è una stringa, lo impostiamo aggiornandolo direttamente come se fosse un normale attributo di oggetto Python:

campaign.name = "Test campaign value"

campaign.manual_cpc è un campo nidificato, ovvero contiene un altro messaggio protobuf e non un tipo primitivo, ad esempio una stringa. Puoi anche aggiornare i relativi campi direttamente:

campaign.manual_cpc.enhanced_cpc_enabled = True

Questo indica all'API che questa campagna ha una strategia di offerta pari a manual_cpc con CPC ottimizzato attivato.

Ma cosa succede se vuoi utilizzare manual_cpm, che è vuoto? Oppure manual_cpc senza attivare il CPC ottimizzato? A questo scopo, dovrai copiare un'istanza vuota separata della classe nella campagna, ad esempio:

client = GoogleAdsClient.load_from_storage()

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

Nota come viene specificato manual_cpm per l'oggetto campaign:

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

Il campo manual_cpm è impostato, ma nessuno dei suoi campi contiene valori. Quando invii la richiesta all'API che utilizza questo pattern, puoi verificare di impostare correttamente l'oggetto messaggio vuoto abilitando il logging e l'ispezione del payload della richiesta.

Infine, dovrai aggiungere manualmente questo campo al update_mask dell'oggetto di richiesta. L'helper della maschera di campo non ha alcun meccanismo per determinare la differenza tra un campo impostato in modo esplicito su un oggetto vuoto e un campo che non è stato impostato.

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")