References¶
Description
Inter-content references in Plone are done using the
reference_catalog
tool.
Introduction¶
Plone uses a persistent tool called reference_catalog
to store
(Archetypes) object references. It is used by the out-of-the-box “Related
items” and you can use it in your own content types with ReferenceField
.
reference_catalog
references can be bidirectional.
The reference_catalog
is a catalog just like the
portal_catalog — it just uses
different indexes and metadata.
The reference_catalog
is defined in ReferenceEngine.py.
Using references¶
Here is an example how to use reference field to make programme -> researcher references, and how to do reverse look-ups for the relationship.
You use getReferences()
and getBackReferences()
methods to look up
relationships.
Example:
from Products.CMFCore.utils import getToolByName
from Products.Archetypes.config import REFERENCE_CATALOG
def getResearcherProgrammes(researcher):
"""
Find all Programmes which refer to this researcher.
The Programme<->Researcher relationship is defined in Programme as::
atapi.ReferenceField(
name='researchers',
widget=ReferenceBrowserWidget(
label="Researchers",
description="Researchers involved in this project",
base_query={'object_provides': IResearcher.__identifier__ },
allow_browse=0,
show_results_without_query=1,
),
multiValued=1,
relationship="researchers_in_theme"
),
@param researcher: Content item on the site
"""
reference_catalog = getToolByName(researcher, REFERENCE_CATALOG)
# relationship: field name used
# Plone 4.1: objects=True argument to fetch full objects, not just
# index brains
references = reference_catalog.getBackReferences(
researcher,
relationship="researchers_in_theme")
# Resolve Reference objects to full objects
# Return a generator method which will yield all full objects
return [ ref.getSourceObject() for ref in references ]