django django-models web-scraping scrapy scrape

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()