diff --git a/lib/models/queryset.js b/lib/models/queryset.js index 739d653..da8e5c0 100644 --- a/lib/models/queryset.js +++ b/lib/models/queryset.js @@ -136,7 +136,7 @@ class AggregationQuerySet { return this.operation(lookup); } - reverse_related(RelatedModel) { + reverse_related({ Model: RelatedModel, options={} }) { const Model = require('./model'); if(!(RelatedModel.prototype instanceof Model)) { throw new Error(`RelatedModel must be an instance of Model. Got ${typeof RelatedModel}`); @@ -150,26 +150,33 @@ class AggregationQuerySet { let lookup = Operations.SelectRelatedOperation.build(RelatedModel, { as: `${underscore_name(RelatedModel.collection_name)}s`, localField: model_pk_key, - foreignField: `${underscore_name(this.Model.collection_name)}_id` + foreignField: `${underscore_name(this.Model.collection_name)}_id`, + ...options }); return this.operation(lookup); } select_related(...keys) { + // keys can be [{ key: xxx, options: xxx }] + // and key can be string (in fields) or Model for(const k of keys) { - this.select_one_related(k); + if(typeof k === 'string') { + this.select_one_related({ key: k }) + } else { + this.select_one_related(k); + } } return this; } - select_one_related(key) { + select_one_related({ key, options={} }) { const Model = require('./model'); - let reversed = (key.prototype && key.prototype instanceof Model); + const reversed = (key.prototype && key.prototype instanceof Model); if(reversed) { - return this.reverse_related(key); + return this.reverse_related({ Model: key, options }); } // Performs some magic @@ -180,18 +187,19 @@ class AggregationQuerySet { throw new Error(`"${key}" is not defined in validation schema for ${this.Model.name}. Cannot select related objects`); } - let field = this.Model.VALIDATION_SCHEMA[key]; + const field = this.Model.VALIDATION_SCHEMA[key]; if(!(field instanceof Fields.ForeignKey)) { throw new Error(`"${key}" is not a foreign key field`); } - let foreign_model = field.Model; - let [foreign_pk_key] = Fields.pk(foreign_model.VALIDATION_SCHEMA); + const foreign_model = field.Model; + const [foreign_pk_key] = Fields.pk(foreign_model.VALIDATION_SCHEMA); let lookup = Operations.SelectRelatedOperation.build(foreign_model, { as: key, localField: field.replace_key(key), - foreignField: foreign_pk_key + foreignField: foreign_pk_key, + ...options }); // Add lookup to join collections