我正在尝试Activty为一个大型(一次300多个)Inquiry对象列表创建一个对象.我有一个ModelForm被回发的单一,我需要创建单独的实例,并将它们附加到我的Inquiry通过a GenericForeignKey.我们来看一些代码:
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.
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是一种将这些插入数据库的方法,最好是一次性传递,以便更快地处理请求.我不想放弃到数据库级别,因为这个应用程序是跨多个数据库供应商部署的,但如果这是继续进行的唯一方法,那么就是这样(MySQL和Postgres的例子很棒).
注意:我知道bulk_create开发版本中有一个,但在有稳定版本之前,这是不可能的.
小智 3
您是否尝试简单地将您的内容封装for在事务结构中?成功提交事务可以显着提高速度,因为条目会一次性批量写入磁盘,因此 DBMS 不必在每个条目之后停止 fsync()。
在最新版本的 django 中实现事务非常快捷,请查看 https://docs.djangoproject.com/en/dev/topics/db/transactions/#controlling-transaction-management-in-views
| 归档时间: |
|
| 查看次数: |
1092 次 |
| 最近记录: |