|
12 | 12 | ManyToManyRel,
|
13 | 13 | ForeignKey,
|
14 | 14 | )
|
15 |
| -from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor |
| 15 | +from django.db.models.fields.related_descriptors import ( |
| 16 | + ReverseManyToOneDescriptor, |
| 17 | + ManyToManyDescriptor, |
| 18 | +) |
16 | 19 | from django.urls import reverse
|
17 | 20 | from rdflib import ConjunctiveGraph, URIRef, Namespace, Literal, BNode
|
18 | 21 | from rdflib.namespace import RDF, XSD
|
@@ -110,18 +113,28 @@ def get_rdf_mapping(instance_id=None):
|
110 | 113 | if attr_name[0] == '_':
|
111 | 114 | continue
|
112 | 115 | 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 | + ) |
121 | 135 | )
|
122 |
| - ) |
123 | 136 |
|
124 |
| - G.add((object_uri, getattr(SCHEMA, mapping['schema_attr']), sub_node)) |
| 137 | + G.add((object_uri, getattr(SCHEMA, mapping['schema_attr']), sub_node)) |
125 | 138 | continue
|
126 | 139 | try:
|
127 | 140 | # get the value from the serialized object
|
|
0 commit comments