Sto cercando di creare un oggetto Activty
per un elenco di dimensioni grandi (300+ alla volta) di oggetti Inquiry
. Ho un singolo ModelForm
che viene posticipato, e ho bisogno di creare istanze separate e collegarle al mio Inquiry
tramite un GenericForeignKey
. Veniamo al codice:Creare voci di database di massa in modo efficiente?
models.py:
class InquiryEntry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
entry = generic.GenericForeignKey('content_type', 'object_id')
class Inquiry(models.Model):
entries = models.ManyToManyField('InquiryEntry')
# And many more fields.
def add_entry(self, obj):
entry = self.entries.create(entry=obj)
self.save()
return entry
class Activity(models.Model):
ts = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(auto_now=False)
## And many more fields.
views.py:
def bulk_create_activities(request):
activity_form = ActivityForm()
if request.method == "POST":
activity_form = ActivityForm(request.POST)
if activity_form.is_valid():
pks = [int(x) for x in request.POST.get('pks', '').split(',')]
for inquiry in Inquiry.objects.filter(pk__in=pks):
instance = ActivityForm(request.POST).save()
inquiry.add_entry(instance)
inquiry.save()
Quello che sto cercando è un modo per inserire questi nel database , preferibilmente in una sola passata in modo che la richiesta possa essere elaborata più velocemente. Preferisco non scendere al livello di database in quanto questa applicazione viene distribuita su più fornitori di database, ma se questo è l'unico modo per procedere, così sia (gli esempi per MySQL e Postgres sarebbe fantastico).
Nota: So che c'è un bulk_create
nella versione di sviluppo, ma che è fuori discussione finché non ci sarà una versione stabile.
Sembra una buona idea, ma non ha cambiato molto le prestazioni. In 5-10 Attività, ha avuto un aumento della velocità del 5% circa. Su 100, una diminuzione della velocità del 10%. –
Grazie per il puntatore. Questa è una grande novità. – AgDude