2011-10-24 6 views
8

Tengo un proyecto de Scrapy y estoy intentando guardar los elementos de salida como un objeto a partir de una definición de modelo de Django (no estoy usando DjangoItem).Guardando el modelo de Django desde el proyecto de Scrapy

Importación de la configuración de Django como se especifica 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) 

En mi proyecto Scrapy que tienen una clase de tubería que procesa todos los artículos al final y lo guarda en la base de datos:

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 

Sin embargo, algo extraño sucede y para el primer artículo me sale un error (ver a continuación). Para el resto de los artículos, todo está bien. Digamos que tengo 7 elementos para guardar, entonces obtengo un error en el primero y los otros 6 se guardan.

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 

Si hago algo como esto, todos los artículos 7 se salvan:

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 

no sé lo que estoy haciendo mal. ¿Podría alguien ayudarme, por favor?

Gracias!

+0

Cuando se refiere a my_django_project, ¿realmente se está refiriendo a eso o reemplazando esa referencia con el nombre de su proyecto, como desde mysite.apps import *? – emschorsch

+0

Estoy reemplazando esa referencia con el nombre de mi proyecto :) – Alex

+0

Hola Alex, estoy tratando de hacer lo que hiciste y de tener problemas. Parece que te diste cuenta de esto, así que esperaba que estuvieras dispuesto a ver mi [pregunta] (http://stackoverflow.com/questions/14686223/scrapy-project-cant-find-django-core-management) y ofrecer consejo. ¡Gracias! – GChorn

Respuesta

4

Tuve el mismo problema y encontré una solución. Al menos, funcionó para mí.

En mi caso, el problema estaba en el archivo setting.py del proyecto Django - No agregué el FQN (fully qualified name) de mi aplicación a la tupla INSTALLED_APPS, pero es un nombre corto.

Hablando de su ejemplo, es posible que haya agregado al elemento INSTALLED_APPS el my_books, pero no el my_django_project.apps.my_books.

+0

Gracias por la respuesta. Lo intentaré tan pronto como tenga el código conmigo. – Alex

0

Recuerdo que falta el archivo __init__.py puede causar algunos problemas extraños. ¿Lo tienes en todos tus módulos?

+0

Sí, lo tengo en todos mis módulos :) – Alex

Cuestiones relacionadas