2011-10-24 31 views
8

Tôi có một dự án Scrapy và tôi đang cố gắng lưu các mục xuất dưới dạng đối tượng từ định nghĩa mô hình Django (Tôi không sử dụng DjangoItem).Lưu mô hình Django từ dự án Scrapy

Tôi đang nhập cài đặt Django như được chỉ định here.

def setup_django_env(path): 
    import imp, os 
    from django.core.management import setup_environ 

    f, filename, desc = imp.find_module('settings', [path]) 
    project = imp.load_module('settings', f, filename, desc)  

    setup_environ(project) 

setup_django_env(PATH_TO_DJANGO_PROJECT) 

Trong dự án Scrapy của tôi, tôi có một lớp đường ống đó sẽ xử lý tất cả các mục ở cuối và lưu nó vào DB:

from my_django_project.apps.my_books.models import Book, Category, Image 

class DjangoPipeline(object): 

    def process_item(self, item, spider): 
     category = Category.objects.get(name='Horror') 
     book = Book(name='something', category=category) 
     book.save() 
     image = Image(name='something', book=book) 
     image.save() 
     return item 

Tuy nhiên, cái gì lạ xảy ra và cho mục đầu tiên tôi nhận được một lỗi (xem bên dưới). Đối với phần còn lại của tất cả mọi thứ mọi thứ đều ổn. Hãy nói rằng tôi có 7 mục để lưu, vì vậy tôi nhận được một lỗi trong một đầu tiên và 6 khác được lưu.

Traceback (most recent call last): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/scrapy/middleware.py", line 54, in _process_chain 
    return process_chain(self.methods[methodname], obj, *args) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/scrapy/utils/defer.py", line 65, in process_chain 
    d.callback(input) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 243, in callback 
    self._startRunCallbacks(result) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 312, in _startRunCallbacks 
    self._runCallbacks() 
--- <exception caught here> --- 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 328, in _runCallbacks 
    self.result = callback(self.result, *args, **kw) 
    File "https://stackoverflow.com/users/ale/djcode/books/lib/scraper/scraper/djangopipeline.py", line 34, in process_item 
    selected_category = Category.objects.get(name='Horror') 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/manager.py", line 132, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 333, in get 
    clone = self.filter(*args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 550, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1131, in add_q 
    can_reuse=used_aliases) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1026, in add_filter 
    negate=negate, process_extras=process_extras) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1182, in setup_joins 
    field, model, direct, m2m = opts.get_field_by_name(name) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 291, in get_field_by_name 
    cache = self.init_name_map() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 321, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 396, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 410, in _fill_related_many_to_many_cache 
    for klass in get_models(): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 167, in get_models 
    self._populate() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 61, in _populate 
    self.load_app(app_name, True) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 76, in load_app 
    app_module = import_module(app_name) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
exceptions.ImportError: No module named my_books 

Nếu tôi làm điều gì đó như thế này, tất cả 7 mục được lưu:

from my_django_project.apps.my_app.models import Book, Category, Image 

class DjangoPipeline(object): 

    def process_item(self, item, spider): 
     try: 
      category = Category.objects.get(name='something') 
     except: 
      category = Category.objects.get(name='something') 
     book = Book(name='something', category=category) 
     try: 
      book.save() 
     except: 
      book.save() 
     image = Image(name='something', book=book) 
     try: 
      image.save() 
     except: 
      image.save() 
     return item 

Tôi không biết những gì tôi đang làm sai. Ai đó có thể giúp tôi xin vui lòng?

Cảm ơn!

+0

Khi bạn tham khảo my_django_project, bạn có thực sự đề cập đến điều đó hay thay thế tham chiếu đó bằng tên dự án của bạn, như từ mysite.apps import *? – emschorsch

+0

Tôi đang thay thế tham chiếu đó bằng tên dự án của tôi :) – Alex

+0

Xin chào Alex, tôi đang cố gắng làm những gì bạn đã làm và gặp sự cố. Có vẻ như bạn đã tìm ra điều này vì vậy tôi hy vọng bạn sẽ sẵn sàng xem [câu hỏi] của tôi (http://stackoverflow.com/questions/14686223/scrapy-project-cant-find-django-core-management) và đưa ra lời khuyên. Cảm ơn! – GChorn

Trả lời

4

Tôi gặp sự cố tương tự và tôi đã tìm thấy giải pháp. Ít nhất, nó làm việc cho tôi.

Trong trường hợp của tôi, sự cố nằm trong tệp setting.py của dự án Django - tôi đã thêm không FQN (fully qualified name) của ứng dụng của tôi vào nhóm INSTALLED_APPS, nhưng đó là tên ngắn.

Nói về ví dụ của bạn, có thể bạn đã thêm vào INSTALLED_APPS phần tử my_books, nhưng không phải là my_django_project.apps.my_books.

+0

Cảm ơn câu trả lời. Tôi sẽ thử nó ngay sau khi tôi có mã với tôi. – Alex

0

Tôi nhớ thiếu tệp __init__.py có thể gây ra một số sự cố lạ. Bạn có nó trên tất cả các mô-đun của bạn?

+0

Có, tôi có nó trong tất cả các mô-đun của tôi :) – Alex

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