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 ne contiennent que des champs facultatifs qu'il n'est pas nécessaire de définir, par exemple campaign.manual_cpc. La définition de ces champs est importante afin d'indiquer à l'API la stratégie d'enchères à utiliser pour la campagne donnée. Toutefois, cette opération n'est pas intuitive lorsque les messages sont vides.

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

L'API sera ainsi informée que la stratégie d'enchères de cette campagne est de manual_cpc et que le CPC optimisé sera activé.

Mais que se passe-t-il 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 ne comporte 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 de message vide en activant la journalisation et en inspectant la charge utile de la requête.

Enfin, vous devez ajouter manuellement ce champ au update_mask de l'objet de la requête. L'outil d'aide 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 non 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")