빈 메시지 객체를 필드로 설정

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

이렇게 하면 이 캠페인에 향상된 CPC 입찰기능이 사용 설정된 manual_cpc 입찰 전략이 있음을 API에 알립니다.

하지만 비어 있는 manual_cpm를 사용하려면 어떻게 해야 할까요? 향상된 CPC 입찰기능을 사용 설정하지 않고 manual_cpc? 이렇게 하려면 클래스의 빈 인스턴스를 별도의 캠페인에 복사해야 합니다. 예를 들면 다음과 같습니다.

client = GoogleAdsClient.load_from_storage()

empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)

campaign 객체에 manual_cpm가 어떻게 지정되었는지 확인하세요.

name {
  value: "Test campaign value"
}
manual_cpm {
}

manual_cpm 필드가 설정되어 있지만 값이 있는 필드가 없습니다. 이 패턴을 사용하는 API에 요청을 보낼 때 logging을 사용 설정하고 요청 페이로드를 검사하여 빈 메시지 객체를 올바르게 설정했는지 확인할 수 있습니다.

마지막으로 이 필드를 요청 객체의 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")