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

ב-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 עם אופטימיזציית עלות לקליק (eCPC) מופעלת.

אבל מה אם רוצים להשתמש ב-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")