def target(self, before_filter): from bpmappers.fields import DelegateField return DelegateField(DummyMapper, before_filter=before_filter)
def target(self): from bpmappers.fields import DelegateField return DelegateField(DummyMapper, required=False)
def __new__(cls, name, bases, attrs): if '_meta' not in attrs: opt = Options() attrs['_meta'] = opt else: opt = attrs['_meta'] # BaseMapperの処理が後に来るので # ここで先にoptを拡張する mapper_meta = attrs.get('Meta') if mapper_meta is not None: model = getattr(mapper_meta, 'model', None) # Meta.mapper_fields mapper_fields = getattr(mapper_meta, 'mapper_fields', None) defined_fields = DEFINED_MODEL_MAPPER_FIELDS.copy() if mapper_fields: defined_fields.update(mapper_fields) # Meta.modelが無い場合はエラー if model is None: raise MetaModelError for model_field in model._meta.fields + model._meta.many_to_many: # Meta.fields if hasattr(mapper_meta, 'fields'): if mapper_meta.fields is not None \ and model_field.name not in mapper_meta.fields: continue # Meta.exclude if hasattr(mapper_meta, 'exclude'): if mapper_meta.exclude is not None \ and model_field.name in mapper_meta.exclude: continue # モデルのフィールドに対応したField追加 if model_field.remote_field: # 同じモデルを参照しようとした場合はスキップする if model == model_field.remote_field.model: continue if isinstance(model_field, models.ForeignKey): # ForeignKey related_model_mapper = create_model_mapper( model_field.remote_field.model, model_mapper_fields=mapper_fields) opt.add_field( model_field.name, DelegateField(related_model_mapper, key=model_field.name, required=not model_field.null)) elif isinstance(model_field, models.ManyToManyField): # ManyToManyField related_model_mapper = create_model_mapper( model_field.remote_field.model, model_mapper_fields=mapper_fields) opt.add_field( model_field.name, ListDelegateField( related_model_mapper, key=model_field.name, filter=lambda manager: manager.all())) else: for defined_field in defined_fields: if isinstance(model_field, defined_field): mapper_field = defined_fields[defined_field] opt.add_field(model_field.name, mapper_field(key=model_field.name)) break else: # If there is no match field, use default. opt.add_field( model_field.name, DEFAULT_MAPPER_FIELD(key=model_field.name)) attrs['_meta'] = opt return BaseMapper.__new__(cls, name, bases, attrs)