我正在嘗試爲Inquiry
對象的大型(每次超過300個)列表創建一個Activty
對象。我有一個正在發佈的ModelForm
,我需要創建單獨的實例,並通過GenericForeignKey
將它們附加到我的Inquiry
。讓我們到一些代碼:高效創建批量數據庫條目?
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()
我所尋找的是插入到這些數據庫的方式,最好是一次傳遞,這樣可以更快地處理請求。由於這個應用程序跨多個數據庫供應商部署,所以我不希望掉到數據庫級別,但如果這是繼續進行的唯一方式,那就這樣吧(MySQL和Postgres的例子會很棒)。
注:我知道有在開發版本的bulk_create
,但那是不可能的,直到有一個穩定的版本。
看起來像一個好主意,但沒有改變性能。在5-10項活動中,速度提高了大約5%。在100,速度下降10%。 –
感謝您的指針。這是一個很棒的新功能。 – AgDude