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 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. Toutefois, il n'est pas intuitif lorsque les messages sont vides.

Lors de la mise à jour du champ campaign.name, qui est une chaîne, nous le définissons en le mettant directement à jour 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

Vous indiquez ainsi à l'API que la stratégie d'enchères de cette campagne est manual_cpc et que le CPC optimisé est activé.

Mais comment procéder 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 de la classe dans la campagne. Exemple:

client = GoogleAdsClient.load_from_storage()

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

Notez la façon dont 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 valeurs. Lorsque vous envoyez une requête à l'API qui utilise ce modèle, vous pouvez vérifier que vous définissez correctement l'objet Message vide en activant la journalisation et en inspectant la charge utile de la requête.

Enfin, vous devez ajouter manuellement ce champ au champ update_mask de l'objet de la requête. L'assistant du masque de champ n'a pas de mécanisme permettant de déterminer la différence entre un champ qui a été explicitement défini 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")