Skip to content

Commit 361d33e

Browse files
when sub node is requested, add one per instance for many to many fields, otherwise pick in the object attribute to build it
1 parent 51629f2 commit 361d33e

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

ifbcat_api/renderers.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
ManyToManyRel,
1313
ForeignKey,
1414
)
15-
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
15+
from django.db.models.fields.related_descriptors import (
16+
ReverseManyToOneDescriptor,
17+
ManyToManyDescriptor,
18+
)
1619
from django.urls import reverse
1720
from rdflib import ConjunctiveGraph, URIRef, Namespace, Literal, BNode
1821
from rdflib.namespace import RDF, XSD
@@ -110,18 +113,28 @@ def get_rdf_mapping(instance_id=None):
110113
if attr_name[0] == '_':
111114
continue
112115
if type(mapping) == dict and (sub_fields := mapping.get('_fields', None)) is not None:
113-
sub_node = BNode()
114-
G.add((sub_node, RDF.type, getattr(SCHEMA, mapping["_type"])))
115-
for attr_name, schema_attr in sub_fields.items():
116-
G.add(
117-
(
118-
sub_node,
119-
getattr(SCHEMA, schema_attr),
120-
Literal(getattr(model.objects.get(id=item['id']), attr_name)),
116+
# by default, we use the object itself as source for the sub node
117+
sub_nodes_src = model.objects.filter(id=item['id'])
118+
try:
119+
if type(getattr(model, attr_name)) in (ManyToManyDescriptor,):
120+
# if the attr_name exists and is an M2M, we use them as sources of the sub nodes
121+
sub_nodes_src = getattr(model.objects.get(id=item['id']), attr_name).all()
122+
except AttributeError:
123+
pass
124+
for sub_node_src in sub_nodes_src:
125+
# for each source, create a new sub node, and get info from this source
126+
sub_node = BNode()
127+
G.add((sub_node, RDF.type, getattr(SCHEMA, mapping["_type"])))
128+
for sub_attr_name, schema_attr in sub_fields.items():
129+
G.add(
130+
(
131+
sub_node,
132+
getattr(SCHEMA, schema_attr),
133+
Literal(getattr(sub_node_src, sub_attr_name)),
134+
)
121135
)
122-
)
123136

124-
G.add((object_uri, getattr(SCHEMA, mapping['schema_attr']), sub_node))
137+
G.add((object_uri, getattr(SCHEMA, mapping['schema_attr']), sub_node))
125138
continue
126139
try:
127140
# get the value from the serialized object

0 commit comments

Comments
 (0)