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, takie jak campaign.manual_cpm, lub mogą zawierać tylko opcjonalne pola, których nie trzeba ustawiać, na przykład campaign.manual_cpc. Ustawienie tych pól jest ważne, aby poinformować API, która strategia ustalania stawek ma zostać użyta w danej kampanii, ale nie jest intuicyjna, gdy wiadomości są puste.

Podczas aktualizowania pola campaign.name, które jest ciągiem znaków, ustawiamy je, tak jakby to był normalny atrybut obiektu Pythona:

campaign.name = "Test campaign value"

campaign.manual_cpc to pole zagnieżdżone, co oznacza, że zawiera inny komunikat protobuf, a nie typ podstawowy, taki jak ciąg znaków. Pola możesz też aktualizować bezpośrednio:

campaign.manual_cpc.enhanced_cpc_enabled = True

Informuje to interfejs API, że kampania ma strategię ustalania stawek manual_cpc z włączonym Ulepszonym CPC.

A co jeśli chcesz użyć właściwości manual_cpm, która jest pusta? A może manual_cpc bez włączania ulepszonego CPC? Aby to zrobić, musisz skopiować do kampanii osobne puste wystąpienie klasy, na przykład:

client = GoogleAdsClient.load_from_storage()

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

Zwróć uwagę, jak określono manual_cpm dla obiektu campaign:

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

Pole manual_cpm jest ustawione, ale żadne z jego pól nie ma wartości. Wysyłając żądanie do interfejsu API wykorzystującego ten wzorzec, 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. Asystent maski pola nie ma mechanizmu umożliwiającego ustalenie różnicy między polem, które zostało ustawione jako puste, a polem, które nie zostało ustawione.

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