הגדרת אובייקטים ריקים של הודעות כשדות

ב-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 שמשתמש בדפוס הזה, ניתן לוודא שאתם מגדירים את אובייקט ההודעה הריק בצורה נכונה על ידי הפעלת logging ובדיקת המטען הייעודי (payload) של הבקשה.

לסיום, צריך להוסיף את השדה הזה באופן ידני ל-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")