@classmethod
def create(cls, **kwargs):
    """
        creates new instance or raises ValidationError
        :param kwargs:
        :return:
        """
    cls.validate(kwargs)
    attrs = {}
    for attribute in cls.get_attributes():
        default = getattr(cls, attribute).default
        if callable(default):
            attrs[attribute] = default(kwargs)
        else:
            attrs[attribute] = default
    attrs.update(dict(kwargs))
    cls.clean(attrs)
    instance = cls(**attrs)
    instance.save()
    return instance
