Come passare oggetti ORM complessi ai lavoratori in background?

1

Mi stavo chiedendo qualcosa su come passare oggetti ORM complessi agli operatori in background, nel mio caso, i modelli Django e Celery, ma questo potrebbe applicarsi a qualsiasi framework di elaborazione in background simile.

Di solito passo gli oggetti del modello "per riferimento" usando la chiave primaria. In quick Python, questo è il modo in cui invio un'email per un utente:

@app.task
def background_task(user_id):
    user = User.objects.get(id=user_id)
    send_email(user.first_name, user.last_name)

background_task.delay(user.id)

Un collaboratore preferisce invece passare i valori direttamente all'attività:

@app.task
def background_task(user_first_name, user_last_name):
    send_email(user_first_name, user_last_name)

background_task.delay(user.first_name, user.last_name)

Trovo che il primo metodo sia molto più semplice da mantenere:

  • Abbiamo compiti che usano il secondo paradigma prendendo 10+ argomenti provenienti da un singolo oggetto, e questi sono piuttosto difficili da leggere e riutilizzare perché è necessario assicurarsi che tutti gli argomenti siano stati presi in considerazione.

  • L'aggiunta di ulteriori informazioni all'attività significa che è necessario aggiungere più argomenti, e assicurarsi che vengano aggiunti anche a tutti i luoghi che utilizzano questa attività, il che richiede molto tempo e soggetto a errori.

Il secondo metodo presenta i seguenti vantaggi:

  • Non corri il rischio di utilizzare le informazioni sbagliate. Ad esempio, con il primo metodo, un modello potrebbe essere aggiornato due volte prima che l'attività possa essere eseguita, con il risultato che il primo aggiornamento non viene elaborato.
  • Inoltre non esegui una seconda query quando l'attività viene eseguita poiché gli argomenti delle attività sono archiviati insieme all'attività, il che potrebbe alleggerire il carico sul database.

Sono piuttosto prevenuto verso il primo metodo, ma nessuno di noi è stato in grado di raggiungere una conclusione al riguardo.

  • Ci sono vantaggi / inconvenienti che non ho elencato?
  • Puoi pensare ad alcuni progetti usando uno di questi che potremmo usare come esempio?
  • Come dovremmo gestirlo?
posta F.X. 03.03.2017 - 19:22
fonte

1 risposta

0

Per passare l'oggetto del modello in un'attività di sedano, puoi utilizzare il serializzatore integrato di django
link

from django.core import serializers
data = serializers.serialize("json", SomeModel.objects.all())

Passa questi dati serializzati come argomento all'attività di sedici e li puoi deserializzare di nuovo

for obj in serializers.deserialize("json", data):
    do_something_with(obj)
    
risposta data 06.11.2018 - 06:38
fonte

Leggi altre domande sui tag