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