2009-12-07 33 views
6

Tôi cần phải nhập dữ liệu của tôi với một loạt các mục giả (khoảng 200+) để tôi có thể kiểm tra giao diện quản trị tôi đã thực hiện và tôi đã tự hỏi nếu có một cách tốt hơn để làm điều đó. Tôi đã dành phần tốt hơn trong ngày hôm qua cố gắng điền vào bằng tay (tức là bằng cách gói những thứ như thế này my_model (tiêu đề = "asdfasdf", field2 = "laksdj" ...) trong một loạt "cho x trong phạm vi (0,200): "vòng lặp" và đã từ bỏ vì nó không hoạt động theo cách tôi mong đợi. Tôi nghĩ rằng this là những gì tôi cần phải sử dụng, nhưng bạn không cần phải có (hiện có) dữ liệu trong cơ sở dữ liệu để làm việc này?Django - Populating một cơ sở dữ liệu cho các mục đích thử nghiệm

+0

Bạn không muốn sắp xếp theo thứ tự. Bạn muốn tạo dữ liệu ban đầu bằng cách chạy trong trình bao, lưu các cá thể, và sau đó xuất khẩu cơ sở dữ liệu vào một lịch thi đấu ở định dạng như json bằng cách sử dụng loaddata: 'python manage.py dumpdata --format = json --indent = 4 appname' @Matthew Schinckel là gần nhất về điều này. – hughdbrown

Trả lời

7

Kiểm tra ứng dụng này

https://github.com/aerosol/django-dilla/

Hãy nói rằng bạn đã viết ứng dụng blog của bạn (oh yeah, yêu thích của bạn!) Trong Django. Các bài kiểm tra đơn vị diễn ra tốt đẹp và mọi thứ chạy cực nhanh, ngay cả những truy vấn siêu dài do ORM tạo ra. Bạn đã thêm một số bài đăng được phân loại và nó vẫn ổn định như một tảng đá. Bạn hoàn toàn chắc chắn rằng ứng dụng này hiệu quả và sẵn sàng để triển khai trực tiếp. Đúng? Sai rồi.

+0

Đây chính xác là thứ tôi đang tìm kiếm. Cảm ơn nhiều! – cornjuliox

+0

@Eeyore: câu trả lời của bạn sẽ không cho phép tôi ngủ. – misterte

4

Bạn có thể sử dụng đồ đạc cho mục đích này và lệnh quản lý loaddata.

Một cách tiếp cận là làm như thế này.

  1. Chuẩn bị cơ sở dữ liệu thử nghiệm của bạn.

  2. Sử dụng dumpdata để tạo JSON xuất cơ sở dữ liệu.

  3. Đặt mã này vào thư mục fixtures của đơn đăng ký của bạn.

  4. Viết thử nghiệm đơn vị của bạn để tải "vật cố định" này.

+0

Tôi chỉ cần thêm một số chi tiết. –

0

Tôi không chắc chắn lý do bạn yêu cầu bất kỳ sự tuần tự hóa nào. Miễn là bạn đã thiết lập tập tin settings.py Django của bạn để trỏ đến cơ sở dữ liệu thử nghiệm của bạn, populating một cơ sở dữ liệu thử nghiệm nên không có gì hơn là tiết kiệm mô hình.

for x in range(0, 200): 
    m = my_model(title=random_title(), field2=random_string(), ...) 
    m.save() 

Có nhiều cách tốt hơn để thực hiện việc này, nhưng nếu bạn muốn thử nghiệm nhanh, đây là cách để thực hiện.

+0

Và bạn đang chạy trong bối cảnh của vỏ, phải không? 'python manage.py shell' – hughdbrown

3

Django fixtures cung cấp cơ chế nhập dữ liệu trên syncdb. Tuy nhiên, việc thực hiện việc truyền dữ liệu ban đầu này thường dễ dàng hơn thông qua mã Python. Kỹ thuật bạn phác thảo sẽ hoạt động, thông qua lệnh syncdb hoặc lệnh quản lý. Ví dụ, thông qua syncdb, trong my_app/management.py:

def init_data(sender, **kwargs): 
    for i in range(1000): 
     MyModel(number=i).save() 

signals.post_syncdb.connect(init_data) 

Hoặc, trong một management command trong myapp/management/commands/my_command.py:

from django.core.management.base import BaseCommand, CommandError 

from models import MyModel 

class MyCommand(BaseCommand): 
    def handle(self, *args, **options): 
     if len(args) > 0: 
      raise CommandError('need exactly zero arguments') 

     for i in range(1000): 
      MyModel(number=i).save() 

Sau đó bạn có thể xuất dữ liệu này cho một fixture, hoặc tiếp tục nhập khẩu bằng cách sử dụng lệnh quản lý. Nếu bạn chọn tiếp tục sử dụng tín hiệu syncdb, bạn sẽ muốn chạy có điều kiện chức năng init_data để ngăn dữ liệu được nhập vào các cuộc gọi syncdb tiếp theo. Khi một trận đấu không đủ, cá nhân tôi muốn làm cả hai: tạo ra một lệnh quản lý để nhập dữ liệu, nhưng có lời gọi syncdb đầu tiên thực hiện việc nhập tự động. Bằng cách đó, triển khai tự động hơn nhưng tôi vẫn có thể dễ dàng thực hiện các sửa đổi đối với dữ liệu ban đầu và chạy lại quá trình nhập.

0

Ứng dụng được đề xuất bởi câu trả lời được chấp nhận là không còn được duy trì tuy nhiên django hạt có thể được sử dụng như một sự thay thế:

https://github.com/brobin/django-seed

0

Tôi muốn giới thiệu django-autofixtures cho bạn. Tôi đã thử cả django_seed và django-autofixtures, nhưng django_seed có rất nhiều vấn đề với các phím độc đáo. django-autofixtures sẽ chăm sóc các ràng buộc db duy nhất, chính và db khác trong khi điền vào cơ sở dữ liệu

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