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
.
Ważne jest, aby ustawić te pola, aby poinformować interfejs API, której strategii ustalania stawek używać w danej kampanii, ale gdy 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
to pole zagnieżdżone, co oznacza, że zawiera inną wiadomość protobuf, a nie typ prosty, np. ciąg znaków. Możesz też zaktualizować pola bezpośrednio:
campaign.manual_cpc.enhanced_cpc_enabled = True
Spowoduje to poinformowanie 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
można to zrobić bez włączania ulepszonego CPC? Aby to zrobić, musisz skopiować pustą instancję klasy do kampanii, 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 ustawione wyraźnie 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")