Leere Nachrichtenobjekte als Felder festlegen

In der Google Ads API sind einige Nachrichtenfelder als leere Nachrichtenobjekte definiert, z. B. campaign.manual_cpm. Möglicherweise gibt es auch nur optionale Felder, die nicht festgelegt werden müssen, z. B. campaign.manual_cpc. Sie müssen diese Felder festlegen, um der API mitzuteilen, welche Gebotsstrategie für die jeweilige Kampagne verwendet werden soll. Wenn die Nachrichten leer sind, ist das jedoch nicht intuitiv.

Beim Aktualisieren des campaign.name-Felds, das ein String ist, legen wir das Feld direkt fest, als wäre es ein normales Python-Objektattribut:

campaign.name = "Test campaign value"

campaign.manual_cpc ist ein verschachteltes Feld, d. h., es enthält eine weitere Protobuf-Nachricht und keinen primitiven Typ wie einen String. Sie können die Felder auch direkt aktualisieren:

campaign.manual_cpc.enhanced_cpc_enabled = True

Dadurch wird der API mitgeteilt, dass für diese Kampagne die Gebotsstrategie manual_cpc mit aktiviertem Auto-optimierten CPC verwendet wird.

Was aber, wenn Sie manual_cpm verwenden möchten, das leer ist? Oder manual_cpc ohne die Funktion „Auto-optimierter CPC“ zu aktivieren? Dazu müssen Sie eine separate leere Instanz der Klasse in die Kampagne kopieren, z. B. so:

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 seiner untergeordneten Felder enthält Werte. Wenn Sie eine Anfrage an die API senden, die dieses Muster verwendet, können Sie prüfen, ob Sie das leere Nachrichtenobjekt richtig festlegen. Aktivieren Sie dazu die Protokollierung und prüfen Sie die Anfragenutzlast.

Schließlich müssen Sie dieses Feld manuell dem update_mask des Anfrageobjekts hinzufügen. Der Feldmasken-Hilfsmechanismus kann nicht zwischen einem Feld unterscheiden, das explizit auf ein leeres Objekt festgelegt wurde, und einem Feld, 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")