diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 8d19c7e9f8..283773ac58 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -336,7 +336,7 @@ class Cache(object): except KeyError: return default_value if field.is_multiple: - default_value = {} if name == 'identifiers' else () + default_value = field.default_value try: return field.for_book(book_id, default_value=default_value) except (KeyError, IndexError): @@ -347,6 +347,8 @@ class Cache(object): ' Same as field_for, except that it avoids the extra lookup to get the field object ' if field_obj.is_composite: return field_obj.get_value_with_cache(book_id, self._get_proxy_metadata) + if field_obj.is_multiple: + default_value = field_obj.default_value try: return field_obj.for_book(book_id, default_value=default_value) except (KeyError, IndexError): diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 9becf82403..50fa658b29 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -48,6 +48,7 @@ class Field(object): self._sort_key = lambda x:sort_key(calibre_langcode_to_name(x)) self.is_multiple = (bool(self.metadata['is_multiple']) or self.name == 'formats') + self.default_value = {} if name == 'identifiers' else () if self.is_multiple else None self.category_formatter = type(u'') if dt == 'rating': self.category_formatter = lambda x:'\u2605'*int(x/2)