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 bien seulement des champs facultatifs qui n'ont pas besoin d'être définis, par exemple campaign.manual_cpc Définir ces est important pour indiquer à l'API la stratégie d'enchères à utiliser pour Campagne, mais cela n'est pas intuitif 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 à 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. Toi peut également mettre à jour ses champs directement:

campaign.manual_cpc.enhanced_cpc_enabled = True

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

Mais que se passe-t-il si vous voulez utiliser manual_cpm, qui est vide ? Ou manual_cpc sans activer le CPC optimisé ? Pour ce faire, vous devez copier un fichier une instance vide 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 contient de valeur. Lors de l'envoi à l'API qui utilise ce format, vérifiez que vous définissez bien l'objet de message vide en activant la fonction logging et en inspectant la charge utile de la requête.

Enfin, vous devez ajouter manuellement ce champ au fichier update_mask L'assistant de masque de champ ne dispose d'aucun mécanisme permettant de déterminer entre un champ défini explicitement sur un objet vide et un objet 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")