Ustawianie pustych obiektów wiadomości jako pól

W interfejsie Google Ads API niektóre pola wiadomości są zdefiniowane jako puste obiekty wiadomości, na przykład campaign.manual_cpm, lub mogą zawierać tylko pola opcjonalne, które nie muszą być ustawione, na przykład campaign.manual_cpc. Ustawienie tych pól jest ważne, ponieważ informuje interfejs API, którą strategię ustalania stawek ma zastosować w danej kampanii, ale jeśli komunikaty są puste, nie jest to intuicyjne.

Podczas aktualizowania pola campaign.name, które jest ciągiem znaków, ustawiamy to pole, aktualizując je bezpośrednio, tak jakby było to zwykłe pole atrybutu obiektu Pythona:

campaign.name = "Test campaign value"

campaign.manual_cpc jest polem zagnieżdżonym, co oznacza, że zawiera inny komunikat protokołu, a nie typ podstawowy, taki jak ciąg znaków. Możesz też zaktualizować pola bezpośrednio:

campaign.manual_cpc.enhanced_cpc_enabled = True

Dowiesz się z interfejsu API, że ta kampania ma strategię ustalania stawek manual_cpc z włączonym Ulepszonym CPC.

Co jednak, jeśli chcesz użyć manual_cpm, który jest pusty? Czy manual_cpc bez włączania Ulepszonego CPC? Aby to zrobić, skopiuj do kampanii osobne, puste wystąpienie klasy, np.:

client = GoogleAdsClient.load_from_storage()

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

Zwróć uwagę, jak parametr manual_cpm jest określony w przypadku obiektu campaign:

name {
  value: "Test campaign value"
}
manual_cpm {
}

Pole manual_cpm jest ustawione, ale żadne z jego pól nie ma wartości. Podczas wysyłania żądania do interfejsu API, które korzysta z tego wzorca, możesz sprawdzić, czy prawidłowo ustawiasz pusty obiekt wiadomości, włączając rejestrowanie i sprawdzając ładunek żądania.

Na koniec musisz ręcznie dodać to pole do update_mask obiektu żądania. Pomocnik maski pola nie ma mechanizmu, który pozwalałby odróżnić pole, które zostało wyraźnie ustawione jako pusty obiekt, od pola, które nie zostało skonfigurowane.

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