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, 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_cpcz włączonym ulepszonym CPC.

Co jednak, jeśli chcesz użyć manual_cpm, który jest pusty? Czy manual_cpcmoż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")