В Google Ads API некоторые поля сообщений определяются как пустые объекты сообщения, например, campaign.manual_cpm
, или они могут иметь только необязательные поля, которые не нужно задавать, например, campaign.manual_cpc
. Установка этих полей важна, чтобы указать API, какую стратегию назначения ставок использовать для данной кампании, но это не интуитивно понятно, когда сообщения пусты.
При обновлении поля campaign.name
, которое является строкой, мы устанавливаем поле, обновляя его напрямую, как если бы это был обычный атрибут объекта Python:
campaign.name = "Test campaign value"
campaign.manual_cpc
— это вложенное поле, то есть оно содержит другое сообщение protobuf, а не примитивный тип, например строку. Вы также можете обновить его поля напрямую:
campaign.manual_cpc.enhanced_cpc_enabled = True
Это сообщит API, что для этой кампании используется стратегия назначения ставок manual_cpc
с включенной расширенной ценой за клик.
Но что, если вы хотите использовать пустое значение manual_cpm
? Или manual_cpc
без включения расширенной цены за клик? Для этого вам потребуется скопировать в кампанию отдельный пустой экземпляр класса, например:
client = GoogleAdsClient.load_from_storage()
empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)
Обратите внимание, как указывается manual_cpm
для объекта campaign
:
name {
value: "Test campaign value"
}
manual_cpm {
}
Поле manual_cpm
задано, но ни одно из его полей не имеет значений. При отправке запроса к API, использующему этот шаблон, вы можете убедиться, что вы правильно настраиваете пустой объект сообщения, включив ведение журнала и проверив полезные данные запроса.
Наконец, вам нужно вручную добавить это поле в update_mask
объекта запроса. Помощник по маске поля не имеет механизма для определения разницы между полем, которое было явно задано как пустой объект, и полем, которое не было задано.
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")