Leere Nachrichtenobjekte als Felder festlegen

In der Google Ads API sind einige Nachrichtenfelder als leere Nachrichtenobjekte definiert. wie campaign.manual_cpm, oder nur optionale Felder enthalten, die nicht festgelegt werden müssen, z. B. campaign.manual_cpc Festlegen ist wichtig, um der API mitzuteilen, welche Gebotsstrategie Kampagne. Es ist jedoch nicht intuitiv, wenn die Nachrichten leer sind.

Beim Aktualisieren des Felds campaign.name, bei dem es sich um einen String handelt, wird das Feld indem Sie es direkt aktualisieren, als wäre es ein normales Python-Objektattribut:

campaign.name = "Test campaign value"

campaign.manual_cpc ist ein verschachteltes Feld, das heißt, es enthält eine andere protobuf-Nachricht und keinen primitiven Typ wie einen String. Ich kann auch seine Felder direkt aktualisieren:

campaign.manual_cpc.enhanced_cpc_enabled = True

Dadurch wird der API mitgeteilt, dass für diese Kampagne die Gebotsstrategie „manual_cpc“ festgelegt ist bei aktiviertem auto-optimiertem CPC.

Aber was ist, wenn Sie das Feld manual_cpm verwenden möchten, das leer ist? oder manual_cpc ohne den auto-optimierten CPC zu aktivieren? Dazu müssen Sie eine separate leere Instanz der Klasse in die Kampagne ein. Beispiel:

client = GoogleAdsClient.load_from_storage()

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

Beachten Sie, wie manual_cpm für das campaign-Objekt angegeben wird:

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

Das Feld manual_cpm ist festgelegt, aber keines der Felder enthält Werte. Beim Senden -Anfrage an die API senden, die dieses Muster verwenden, können Sie überprüfen, ob Sie den Parameter leeres Nachrichtenobjekt korrekt, indem Sie logging aktivieren und die Nutzlast der Anfrage.

Schließlich müssen Sie dieses Feld manuell zum update_mask Das Hilfsprogramm für die Feldmaske hat keinen Mechanismus zur Bestimmung der einem Feld, das explizit auf ein leeres Objekt festgelegt wurde, und einem das nicht festgelegt wurde.

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")