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, comme campaign.manual_cpm, ou ne comportent que des champs facultatifs qui ne doivent pas ê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 vous mettez à 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 indique à l'API que cette campagne a une stratégie d'enchères de 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 sur 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 ne contient de valeur. Lorsque vous envoyez une requête à l'API qui utilise ce modèle, vous pouvez vérifier que vous définissez correctement l'objet de message vide en activant la journalisation et en inspectant la charge utile de la requête.

Enfin, vous devrez ajouter manuellement ce champ à la 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 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")