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ą mieć tylko opcjonalne pola, których nie trzeba ustawiać, np. campaign.manual_cpc. Ich określenie jest ważne, ponieważ informuje interfejs API, której strategii ustalania stawek ma używać w przypadku danej kampanii. Gdy komunikaty są puste, jest to mało intuicyjne.

Aktualizując pole campaign.name, które jest ciągiem tekstowym, ustawiamy je, aktualizując je bezpośrednio tak, jakby było to zwykły atrybut obiektu Pythona:

campaign.name = "Test campaign value"

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

campaign.manual_cpc.enhanced_cpc_enabled = True

Informuje to interfejs API, że w tej kampanii stosowana jest strategia ustalania stawek manual_cpc z włączonym Ulepszonym CPC.

A co, jeśli chcesz użyć atrybutu manual_cpm, który jest pusty? Czy może manual_cpc bez włączania Ulepszonego CPC? Aby to zrobić, musisz skopiować do kampanii oddzielną 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śla się właściwość 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, który korzysta z tego wzorca, możesz sprawdzić, czy poprawnie ustawiasz pusty obiekt wiadomości, włączając logowanie i sprawdzając ładunek żądania.

Na koniec musisz ręcznie dodać to pole do klasy update_mask obiektu żądania. Asystent maski pól nie ma mechanizmu do określania różnicy między polem, które ma jawnie ustawiony 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")