django - Llaves extranjeras en Scrapy
django-models web-scraping (2)
Como se hizo aquí , coloque el ID de su creatividad directamente en creative_id, debería funcionar, creo:
project["creative_id"] = creative.id
Especificará la clave externa, sin molestarte con el objeto que falta (porque estás en un entorno de Scrapy donde no tocas directamente los objetos del modelo ...).
Estoy haciendo una chatarra con scrapy y mi modelo en django es:
class Creative(models.Model):
name = models.CharField(max_length=200)
picture = models.CharField(max_length=200, null = True)
class Project(models.Model):
title = models.CharField(max_length=200)
description = models.CharField(max_length=500, null = True)
creative = models.ForeignKey(Creative)
class Image(models.Model):
url = models.CharField(max_length=500)
project = models.ForeignKey(Project)
Y mi modelo de scrapy:
from scrapy.contrib.djangoitem import DjangoItem
from app.models import Project, Creative
class ProjectItems(DjangoItem):
django_model = Project
class CreativeItems(DjangoItem):
django_model = Creative
Entonces cuando ahorro
creative["name"] = hxs.select(''//*[@id="owner"]/text()'').extract()[0]
picture = hxs.select(''//*[@id="owner-icon"]/a/img/@src'').extract()
if len(picture)>0:
creative["picture"] = picture[0]
creative.save()
# Extract title and description of the project
project["title"] = hxs.select(''//*[@id="project-title"]/text()'').extract()[0]
description = hxs.select(''//*[@class="project-description"]/text()'').extract()
if len(description)>0:
project["description"] = description[0]
project["creative"] = creative
project.save()
Obtuve el error:
Project.creative "debe ser una instancia" Creativa ".
Entonces, ¿cómo puedo agregar un valor de clave externa en scrapy?
Esto se puede hacer asignando el valor de retorno de creative.save()
al valor en el project[''creative'']
Entonces, por ejemplo, en el siguiente ejemplo usamos la variable djangoCreativeItem
para pasar esta información al proyecto:
creative["name"] = hxs.select(''//*[@id="owner"]/text()'').extract()[0]
picture = hxs.select(''//*[@id="owner-icon"]/a/img/@src'').extract()
if len(picture)>0:
creative["picture"] = picture[0]
djangoCreativeItem = creative.save()
# Extract title and description of the project
project["title"] = hxs.select(''//*[@id="project-title"]/text()'').extract()[0]
description = hxs.select(''//*[@class="project-description"]/text()'').extract()
if len(description)>0:
project["description"] = description[0]
project["creative"] = djangoCreativeItem
project.save()