def _fill_model_fields(model, **kwargs): model_fields, fields_args = split_model_kwargs(kwargs) # fill virtual fields for field in compat.get_model_private_fields(model): if field.name in model_fields: object = kwargs[field.name] model_fields[field.ct_field] = kwargs[field.ct_field]= ContentType.objects.get_for_model(object) model_fields[field.fk_field] = kwargs[field.fk_field]= object.id # fill local fields for field in model._meta.fields: if field.name in model_fields: if isinstance(kwargs[field.name], Q): """ Lookup ForeingKey field in db """ key_field = model._meta.get_field(field.name) value = compat.get_remote_field_model(key_field).objects.get(kwargs[field.name]) setattr(model, field.name, value) else: # TODO support any_model call setattr(model, field.name, kwargs[field.name]) elif isinstance(field, models.OneToOneField) and compat.get_remote_field(field).parent_link: """ skip link to parent instance """ elif isinstance(field, models.fields.AutoField): """ skip primary key field """ elif isinstance(field, models.fields.related.ForeignKey) and field.model == compat.get_remote_field_model(field): """ skip self relations """ else: setattr(model, field.name, any_field(field, **fields_args[field.name])) for field_name, field in compat.get_model_onetoone_fields(model): if field_name in model_fields: # TODO support any_model call setattr(model, field_name, kwargs[field_name])
def any_model_with_defaults(cls, **attrs): """Use model-provided defaults""" for field in cls._meta.fields: default = field.default if default is not NOT_PROVIDED: if callable(default): # for stuff like default=datetime.now default = default() if isinstance(field, (ForeignKey, OneToOneField)): Model = compat.get_remote_field_model(field) if not isinstance(default, Model): try: default = Model.objects.get(pk=default) except Model.DoesNotExist: pass attrs.setdefault(field.name, default) return any_model(cls, **attrs)
def any_onetoone_field(field, **kwargs): return any_model(compat.get_remote_field_model(field), **kwargs)
def any_foreignkey_field(field, **kwargs): return any_model(compat.get_remote_field_model(field), **kwargs)