Définir des objets de message vides en tant que champs

Dans l'API Google Ads, certains champs de message sont définis comme des objets de message vides, tels que campaign.manual_cpm, ou ils peuvent ne comporter que des champs facultatifs qui n'ont pas besoin d'être définis, par exemple campaign.manual_cpc. Il est important de définir ces champs pour indiquer à l'API la stratégie d'enchères à utiliser pour la campagne donnée, mais ce n'est pas intuitif lorsque les messages sont vides.

Lorsque nous mettons à jour le champ campaign.name, qui est une chaîne, nous le définissons en le mettant à jour directement comme s'il s'agissait d'un attribut d'objet Python normal :

campaign.name = "Test campaign value"

campaign.manual_cpc est un champ imbriqué, ce qui signifie qu'il contient un autre message protobuf et non un type primitif, comme une chaîne. Vous pouvez également mettre à jour ses champs directement :

campaign.manual_cpc.enhanced_cpc_enabled = True

Cela indiquera à l'API que cette campagne utilise une stratégie d'enchères manual_cpc avec le CPC optimisé activé.

Mais que faire si vous souhaitez utiliser manual_cpm, qui est vide ? Ou manual_cpc sans activer le CPC optimisé ? Pour ce faire, vous devez copier une instance vide distincte de la classe dans la campagne, par exemple :

client = GoogleAdsClient.load_from_storage()

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

Notez comment manual_cpm est spécifié pour l'objet campaign :

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

Le champ manual_cpm est défini, mais aucun de ses champs n'a de valeur. Lorsque vous envoyez des requêtes à l'API qui utilisent ce modèle, vous pouvez vérifier que vous définissez correctement l'objet de message vide en activant l'enregistrement des journaux et en inspectant la charge utile de la requête.

Enfin, vous devrez ajouter manuellement ce champ à l'update_mask de l'objet de requête. L'assistant de masque de champ ne dispose d'aucun mécanisme permettant de déterminer la différence entre un champ qui a été défini explicitement sur un objet vide et un champ qui n'a pas été défini.

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