From e14c41636f7b149192abae62fc83de7345931bc0 Mon Sep 17 00:00:00 2001 From: Vladislav Date: Wed, 25 Jul 2012 10:10:46 +0800 Subject: [PATCH 1/2] Pass into the model only existing fields Model fields has default values and when field doesn't exists in item container, added `None` instead default value. My patch solves this problem. --- scrapy/contrib_exp/djangoitem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scrapy/contrib_exp/djangoitem.py b/scrapy/contrib_exp/djangoitem.py index 1abe98bfd..571dace5c 100644 --- a/scrapy/contrib_exp/djangoitem.py +++ b/scrapy/contrib_exp/djangoitem.py @@ -25,7 +25,8 @@ class DjangoItem(Item): django_model = None def save(self, commit=True): - modelargs = dict((f, self.get(f, None)) for f in self._model_fields) + modelargs = dict((k, self.get(k)) for k in self._values + if k in self._model_fields) model = self.django_model(**modelargs) if commit: model.save() From 0497ac2fc86deae85f3f17f39ac81d1a92555fdc Mon Sep 17 00:00:00 2001 From: Vladislav Poluhin Date: Thu, 26 Jul 2012 20:55:55 +0800 Subject: [PATCH 2/2] Simple test for default values of model in DjangoItem --- scrapy/tests/test_djangoitem/__init__.py | 4 ++++ scrapy/tests/test_djangoitem/models.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/scrapy/tests/test_djangoitem/__init__.py b/scrapy/tests/test_djangoitem/__init__.py index 46ce4a012..e3ffb176f 100644 --- a/scrapy/tests/test_djangoitem/__init__.py +++ b/scrapy/tests/test_djangoitem/__init__.py @@ -78,3 +78,7 @@ class DjangoItemTest(unittest.TestCase): self.assertEqual(person.name, 'John') + def test_default_field_values(self): + i = BasePersonItem() + person = i.save(commit=False) + self.assertEqual(person.name, 'Robot') diff --git a/scrapy/tests/test_djangoitem/models.py b/scrapy/tests/test_djangoitem/models.py index d2098632a..2beaee752 100644 --- a/scrapy/tests/test_djangoitem/models.py +++ b/scrapy/tests/test_djangoitem/models.py @@ -2,7 +2,7 @@ from django.db import models class Person(models.Model): - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, default='Robot') age = models.IntegerField() class Meta: