2014-10-06 4 views
0

Я хочу использовать Scrapy с Джанго, но я не знаю, как бороться с Джанго ForeignKey
Моей базы данных является PostGreSQLSCRAPY с Джанго: как использовать внешний ключ

Пожалуйста, руководство меня. Спасибо.

models.py:

class ShoppingApple(models.Model): 
    link  = models.URLField(max_length=255)  
    title  = models.CharField(max_length=100)  

class ImageApple(models.Model): 
    article = models.ForeignKey(ShoppingApple)  
    image =models.CharField(max_length=255) 

pipelines.py:

class ShopPipeline(object): 
    if isinstance(item, Shop_appleItem): 
     shopping = item.save(commit=False) 
     shopping.save() 
     return item 

    if isinstance(item, Shop_apple_imgItem): 
     shopping = item.save(commit=False) 
     shopping.save() 
     return item 

паука, как это:

def parse(self,response): 
    item = Shopping_appleItem() 
    product = Shopping_apple_imgItem() 
    sel = Selector(response) 
    item['link'] = sel.css(" ").extract() 
    item['title'] = sel.css(" ").extract() 
    product['image'] = sel.css(" ").extract() 
    yield item 
    yield product 

Когда я бегу мой Scrapy, ошибка:

django.db.utils.IntegrityError: null value in column "article_id" violates not-null constraint 
DETAIL: Failing row contains (1, null, http://test...). 

ответ

0

Вы проверили, есть ли у вас значение null? Попробуйте установить для значения по умолчанию значение null только для теста.

ALTER TABLE article SET DEFAULT NULL 

PostgreSQL ALTER TABLE

Затем запустите снова, чтобы увидеть, если вы получите ту же самую ошибку.

0

Используете ли вы юг или какой-либо другой инструмент для миграции (или Django 1.7+)? Если это так, просто обновите модели до:

class ImageApple(models.Model): 
    article = models.ForeignKey(ShoppingApple)  
    image =models.CharField(max_length=255, null=True) 

Создайте и выполните миграцию, это должно сделать трюк.

+0

Я обнаружил, что, возможно, это потому, что я не сохранил '' '' '' '' '' ', но я не знаю, как это сделать – user2492364

0

То, что я делаю, - это использовать обычный элемент scrapy (а не элемент django, эта вещь довольно ограничена) и просто создать объект вручную и добавить то, что мне нужно.

class MyItem(scrapy.Item): 
    name = scrapy.Field() 
    image_url = scrapy.Field() 

и обрабатывать загрузку вручную и создавать объекты по себе:

object = Object.objects.create(foo="something") 
object.save() 
self.image_url = item['image_url'] 
self.get_remote_image(object) 

Вы можете получить изображения легко с URLLIB:

четкости get_remote_image (само, объект):

if self.image_url: 
    myopener = MyOpener() 
    page = myopener.retrieve(self.image_url) 
    response = page[0] 
    image = open(response) 

    extension = os.path.splitext(image.name)[1] 
    picture = Picture(object=object) 
    picture.save() 
    picture.picture.save('new' + extension, File(image)) 

Я попытался сделать это с предметами django, но устал от попытки и нашел этот путь. Это не сложно реализовать и позволяет больше свободы в создании ваших объектов. Не забудьте добавить django.setup() к настройкам вашего scrapper.py.

Смежные вопросы