2012-05-21 51 views
8

Tôi có một danh sách, mà tôi muốn bulk_create mục cho trong cơ sở dữ liệu.Django 1.4 - bulk_create với một danh sách

Làm cách nào tôi có thể thực hiện việc này mà không lặp qua danh sách mà tôi cho là sẽ lấy đi điểm bulk_create.

Ví dụ:

Thay vì ...

for x in list: 
    bulk_create... 

Làm thế nào có thể tôi ...

bulk_create for the entire list at once in an efficient manner 

Danh sách bao gồm:

list = ['abc', 'def', 'ghi'] 

Nó chỉ đơn giản là một danh sách của id, không phải ở dạng ady được cho ăn trực tiếp vào bulk_create (không được định dạng với các trường nhập). Tuy nhiên, tôi cho rằng nó có thể sửa đổi danh sách trước khi chuyển nó vào bulk_create.

+0

Có gì trong danh sách của bạn? – jdi

+0

Tôi không hiểu. Bạn muốn tạo danh sách các đối tượng có id rõ ràng thay vì cho phép chúng tự động làm hỏng? Đó là những gì bạn đang sau? – jdi

+0

@jdi Tôi sẽ thay đổi ví dụ và cố gắng đưa ra một ví dụ cụ thể hơn. – snakesNbronies

Trả lời

21

bulk_create lấy danh sách các đối tượng dưới dạng một đơn vị duy nhất, trong một cuộc gọi. Những gì bạn đang làm trong ví dụ của bạn sẽ giống như vòng lặp và làm create()

Cách tham khảo: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

aList = [ 
    Entry(headline="Django 1.0 Released"), 
    Entry(headline="Django 1.1 Announced"), 
    Entry(headline="Breaking: Django is awesome") 
] 
Entry.objects.bulk_create(aList) 

aList đề cập đến một danh sách các đối tượng mà bạn đã có thể hiện và cần phải tạo ra với số lượng lớn với một truy vấn. Ví dụ: nếu bạn chưa có danh sách các trường hợp chưa lưu đó và bạn đã có danh sách các giá trị, thì bạn có thể tạo danh sách của mình bằng một cái gì đó như:

values = ['abc', 'def', 'ghi'] 
# a list of unsaved Entry model instances 
aList = [Entry(headline=val) for val in values] 

Hoặc có thể bạn có danh sách các giá trị từ điển thô rằng bản đồ để mô hình:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}] 
aList = [Entry(**vals) for vals in values] 
+0

Điều này sẽ vẫn yêu cầu tôi đặt thủ công các đối số trong 'aList'. Bạn có thể nghĩ ra cách nào để bỏ qua điều này không? Tôi đã có một danh sách. Tôi cho rằng tôi ** COULD ** chuyển đổi nó thành một danh sách các chuỗi với chính xác những gì bạn đã liệt kê trong aList? – snakesNbronies

+0

@thong: Tôi nghĩ rằng bạn có thể bị thiếu điểm. Nếu bạn đã có danh sách các đối tượng, chỉ cần chuyển danh sách đó vào 'bulk_create' một lần. Ví dụ này hiển thị danh sách sẽ chứa cho bạn để vượt qua nó. Nếu bạn vẫn còn bối rối về phần này, bạn có thể cập nhật câu hỏi của bạn để hiển thị những gì có trong danh sách mà bạn đã có? – jdi

+0

danh sách không có định dạng aList của bạn. tôi sẽ thử chỉnh sửa danh sách để xem nó có hiệu quả không. – snakesNbronies

3
>>> Entry.objects.bulk_create([ 
...  Entry(headline="Django 1.0 Released"), 
...  Entry(headline="Django 1.1 Announced"), 
...  Entry(headline="Breaking: Django is awesome") 
... ]) 

Bạn đang đi qua các ORM một danh sách các đối tượng được thuyết minh trong một danh sách. Sử dụng này, và giả orig_list đó là một danh sách các từ điển,

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list] 
>>> MyObject.objects.bulk_create(my_objects) 
1

Hãy thử điều này, và điểm của bulk_create là để đạt cơ sở dữ liệu chỉ một lần, dù có bao nhiêu bạn đang tạo. Đó là lý do tại sao chúng tôi coi nó là hiệu quả.

class Entry(models.Model): 
    name = models.CharField(max_length = 10) 

a = ['test1', 'test2', 'test3', 'test4'] 

Entry.objects.bulk_create([Entry(name=x) for x in a]) 

--- Chỉnh sửa ---

Giả sử bạn có một mô hình như thế này, trong models.py của bạn:

class Entry(models.Model): 
    id = models.CharField(max_length = 10) 

Và bạn có một danh sách như thế này (sao chép trực tiếp từ câu hỏi của bạn):

list = ['abc', 'def', 'ghi'] 

đơn giản chỉ cần một dòng:

Entry.objects.bulk_create([Entry(id=x) for x in list]) 
+0

Điều này sẽ vẫn yêu cầu tôi đặt thủ công các đối số trong danh sách a. Bạn có thể nghĩ ra cách nào để bỏ qua điều này không? – snakesNbronies

+0

@thong Tôi đoán bạn đã bỏ qua một phần câu trả lời của tôi. danh sách ở đây chỉ dành cho mục đích trình diễn, không cần phải "đặt thủ công". Xem chỉnh sửa. – xbtsw

+0

cảm ơn! Tôi khá mới để lập trình vì vậy tôi đã không nhận được nó cho đến khi chỉnh sửa. – snakesNbronies

Các vấn đề liên quan