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, np. campaign.manual_cpm, lub mogą zawierać tylko pola opcjonalne, których nie trzeba ustawiać, np. campaign.manual_cpc. Ustawienie tych pól jest ważne, aby poinformować interfejs API, której strategii ustalania stawek ma używać w przypadku danej kampanii, ale gdy komunikaty są puste, nie jest to intuicyjne.

Podczas aktualizowania pola campaign.name, które jest ciągiem znaków, ustawiamy pole, aktualizując je bezpośrednio, tak jakby było zwykłym atrybutem 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 prosty, taki jak ciąg znaków. Możesz też bezpośrednio zaktualizować jego pola:

campaign.manual_cpc.enhanced_cpc_enabled = True

Poinformuje to interfejs API, że ta kampania ma strategię ustalania stawek manual_cpcz włączonym ulepszonym CPC.

A co, jeśli chcesz użyć pustego znaku manual_cpm? lub manual_cpcbez włączania ulepszonego CPC? Aby to zrobić, musisz skopiować do kampanii osobną pustą instancję klasy, np.:

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. Gdy wysyłasz do interfejsu API żądanie, które korzysta z tego wzorca, możesz sprawdzić, czy prawidłowo ustawiasz pusty obiekt wiadomości, włączając logowanie i sprawdzając ładunek żądania.

Na koniec musisz ręcznie dodać to pole do obiektu żądaniaupdate_mask. Narzędzie do tworzenia maski pola nie ma mechanizmu, który pozwala określić różnicę między polem, które zostało jawnie ustawione na pusty obiekt, 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")