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